Fix button roundtrip in editor, alignment persistence, and test email rendering
This commit is contained in:
373
includes/Setup/DefaultPages.php
Normal file
373
includes/Setup/DefaultPages.php
Normal file
@@ -0,0 +1,373 @@
|
||||
<?php
|
||||
namespace WooNooW\Setup;
|
||||
|
||||
/**
|
||||
* Default Pages Setup
|
||||
* Creates default pages with WooNooW structure on plugin activation
|
||||
*/
|
||||
class DefaultPages
|
||||
{
|
||||
/**
|
||||
* Ensure all default pages exist
|
||||
*/
|
||||
public static function create_pages()
|
||||
{
|
||||
self::create_home_page();
|
||||
self::create_about_page();
|
||||
self::create_contact_page();
|
||||
self::create_legal_pages();
|
||||
self::create_woocommerce_pages();
|
||||
self::ensure_spa_settings();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure SPA Settings are configured
|
||||
*/
|
||||
private static function ensure_spa_settings()
|
||||
{
|
||||
$settings = get_option('woonoow_appearance_settings', []);
|
||||
|
||||
// Ensure General array exists
|
||||
if (!isset($settings['general'])) {
|
||||
$settings['general'] = [];
|
||||
}
|
||||
|
||||
// Enable SPA mode if not set
|
||||
if (empty($settings['general']['spa_mode']) || $settings['general']['spa_mode'] === 'disabled') {
|
||||
$settings['general']['spa_mode'] = 'full';
|
||||
}
|
||||
|
||||
// Set SPA Root Page if missing (prioritize Home, then Shop)
|
||||
if (empty($settings['general']['spa_page'])) {
|
||||
$home_page = get_page_by_path('home');
|
||||
$shop_page_id = get_option('woocommerce_shop_page_id');
|
||||
|
||||
if ($home_page) {
|
||||
// If Home exists, make it the Front Page AND SPA Root
|
||||
$settings['general']['spa_page'] = $home_page->ID;
|
||||
update_option('show_on_front', 'page');
|
||||
update_option('page_on_front', $home_page->ID);
|
||||
} elseif ($shop_page_id) {
|
||||
// Fallback to Shop
|
||||
$settings['general']['spa_page'] = $shop_page_id;
|
||||
}
|
||||
}
|
||||
|
||||
update_option('woonoow_appearance_settings', $settings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Home Page with Rich Layout
|
||||
*/
|
||||
private static function create_home_page()
|
||||
{
|
||||
$slug = 'home';
|
||||
$title = 'Home';
|
||||
|
||||
if (self::page_exists($slug)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$structure = [
|
||||
'type' => 'page',
|
||||
'sections' => [
|
||||
[
|
||||
'id' => 'section-hero-home',
|
||||
'type' => 'hero',
|
||||
'layoutVariant' => 'default',
|
||||
'colorScheme' => 'primary',
|
||||
'props' => [
|
||||
'title' => ['type' => 'static', 'value' => 'Welcome onto WooNooW'],
|
||||
'subtitle' => ['type' => 'static', 'value' => 'Discover our premium collection of products tailored just for you. Quality meets style in every item.'],
|
||||
'cta_text' => ['type' => 'static', 'value' => 'Shop Now'],
|
||||
'cta_url' => ['type' => 'static', 'value' => '/shop'],
|
||||
'image' => ['type' => 'static', 'value' => 'https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=1600&q=80'],
|
||||
],
|
||||
'elementStyles' => [
|
||||
'title' => ['fontSize' => 'text-5xl', 'fontWeight' => 'font-bold'],
|
||||
]
|
||||
],
|
||||
[
|
||||
'id' => 'section-features-home',
|
||||
'type' => 'feature-grid',
|
||||
'layoutVariant' => 'grid-3',
|
||||
'props' => [
|
||||
'heading' => ['type' => 'static', 'value' => 'Why Choose Us'],
|
||||
'features' => ['type' => 'static', 'value' => json_encode([
|
||||
['icon' => 'truck', 'title' => 'Free Shipping', 'description' => 'On all orders over $50'],
|
||||
['icon' => 'shield', 'title' => 'Secure Payment', 'description' => '100% secure payment processing'],
|
||||
['icon' => 'clock', 'title' => '24/7 Support', 'description' => 'Dedicated support anytime you need'],
|
||||
])]
|
||||
]
|
||||
],
|
||||
[
|
||||
'id' => 'section-story-home',
|
||||
'type' => 'image-text',
|
||||
'layoutVariant' => 'image-left',
|
||||
'props' => [
|
||||
'title' => ['type' => 'static', 'value' => 'Our Story'],
|
||||
'text' => ['type' => 'static', 'value' => 'Founded with a passion for quality and design, we strive to bring you products that elevate your everyday life. Every item is carefully curated and inspected to ensure it meets our high standards.'],
|
||||
'image' => ['type' => 'static', 'value' => 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&q=80'],
|
||||
]
|
||||
],
|
||||
[
|
||||
'id' => 'section-cta-home',
|
||||
'type' => 'cta-banner',
|
||||
'colorScheme' => 'muted',
|
||||
'props' => [
|
||||
'title' => ['type' => 'static', 'value' => 'Ready to start shopping?'],
|
||||
'text' => ['type' => 'static', 'value' => 'Join thousands of satisfied customers today.'],
|
||||
'button_text' => ['type' => 'static', 'value' => 'View Catalog'],
|
||||
'button_url' => ['type' => 'static', 'value' => '/shop'],
|
||||
]
|
||||
]
|
||||
],
|
||||
'created_at' => current_time('mysql'),
|
||||
];
|
||||
|
||||
self::insert_page($title, $slug, $structure);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create About Us Page
|
||||
*/
|
||||
private static function create_about_page()
|
||||
{
|
||||
$slug = 'about';
|
||||
$title = 'About Us';
|
||||
|
||||
if (self::page_exists($slug)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$structure = [
|
||||
'type' => 'page',
|
||||
'sections' => [
|
||||
[
|
||||
'id' => 'section-hero-about',
|
||||
'type' => 'hero',
|
||||
'layoutVariant' => 'centered',
|
||||
'colorScheme' => 'secondary',
|
||||
'props' => [
|
||||
'title' => ['type' => 'static', 'value' => 'About Us'],
|
||||
'subtitle' => ['type' => 'static', 'value' => 'Learn more about our journey and mission.'],
|
||||
'image' => ['type' => 'static', 'value' => 'https://images.unsplash.com/photo-1522071820081-009f0129c71c?w=1600&q=80'],
|
||||
]
|
||||
],
|
||||
[
|
||||
'id' => 'section-story-about',
|
||||
'type' => 'image-text',
|
||||
'layoutVariant' => 'image-right',
|
||||
'props' => [
|
||||
'title' => ['type' => 'static', 'value' => 'Who We Are'],
|
||||
'text' => ['type' => 'static', 'value' => 'We are a team of passionate individuals dedicated to providing the best shopping experience. Our mission is to make quality products accessible to everyone.'],
|
||||
'image' => ['type' => 'static', 'value' => 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=800&q=80'],
|
||||
]
|
||||
],
|
||||
[
|
||||
'id' => 'section-values-about',
|
||||
'type' => 'feature-grid',
|
||||
'layoutVariant' => 'grid-3',
|
||||
'props' => [
|
||||
'heading' => ['type' => 'static', 'value' => 'Our Core Values'],
|
||||
'features' => ['type' => 'static', 'value' => json_encode([
|
||||
['icon' => 'heart', 'title' => 'Passion', 'description' => 'We love what we do'],
|
||||
['icon' => 'star', 'title' => 'Excellence', 'description' => 'We aim for the best'],
|
||||
['icon' => 'users', 'title' => 'Community', 'description' => 'We build relationships'],
|
||||
])]
|
||||
]
|
||||
]
|
||||
],
|
||||
'created_at' => current_time('mysql'),
|
||||
];
|
||||
|
||||
self::insert_page($title, $slug, $structure);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Contact Page
|
||||
*/
|
||||
private static function create_contact_page()
|
||||
{
|
||||
$slug = 'contact';
|
||||
$title = 'Contact Us';
|
||||
|
||||
if (self::page_exists($slug)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$structure = [
|
||||
'type' => 'page',
|
||||
'sections' => [
|
||||
[
|
||||
'id' => 'section-hero-contact',
|
||||
'type' => 'hero',
|
||||
'layoutVariant' => 'default',
|
||||
'colorScheme' => 'gradient',
|
||||
'props' => [
|
||||
'title' => ['type' => 'static', 'value' => 'Get in Touch'],
|
||||
'subtitle' => ['type' => 'static', 'value' => 'Have questions? We are here to help.'],
|
||||
]
|
||||
],
|
||||
[
|
||||
'id' => 'section-form-contact',
|
||||
'type' => 'contact-form',
|
||||
'props' => [
|
||||
'title' => ['type' => 'static', 'value' => 'Send us a Message'],
|
||||
]
|
||||
]
|
||||
],
|
||||
'created_at' => current_time('mysql'),
|
||||
];
|
||||
|
||||
self::insert_page($title, $slug, $structure);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Legal Pages
|
||||
*/
|
||||
private static function create_legal_pages()
|
||||
{
|
||||
$pages = [
|
||||
'privacy-policy' => 'Privacy Policy',
|
||||
'terms-conditions' => 'Terms & Conditions',
|
||||
];
|
||||
|
||||
foreach ($pages as $slug => $title) {
|
||||
if (self::page_exists($slug)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$content = "<h2>{$title}</h2><p>This is a placeholder for your {$title}. Please update this content with your actual legal text.</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>";
|
||||
|
||||
$structure = [
|
||||
'type' => 'page',
|
||||
'sections' => [
|
||||
[
|
||||
'id' => 'section-content-' . $slug,
|
||||
'type' => 'content',
|
||||
'layoutVariant' => 'narrow',
|
||||
'props' => [
|
||||
'content' => ['type' => 'static', 'value' => $content],
|
||||
]
|
||||
]
|
||||
],
|
||||
'created_at' => current_time('mysql'),
|
||||
];
|
||||
|
||||
self::insert_page($title, $slug, $structure);
|
||||
|
||||
// If privacy policy, link it in WP settings
|
||||
if ($slug === 'privacy-policy') {
|
||||
$page = get_page_by_path($slug);
|
||||
if ($page) {
|
||||
update_option('wp_page_for_privacy_policy', $page->ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create WooCommerce Pages (Shop, Cart, Checkout, My Account)
|
||||
*/
|
||||
private static function create_woocommerce_pages()
|
||||
{
|
||||
if (!class_exists('WooCommerce')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$wc_pages = [
|
||||
'shop' => ['title' => 'Shop', 'content' => '', 'option' => 'woocommerce_shop_page_id'],
|
||||
'cart' => ['title' => 'Cart', 'content' => '<!-- wp:shortcode -->[woocommerce_cart]<!-- /wp:shortcode -->', 'option' => 'woocommerce_cart_page_id'],
|
||||
'checkout' => ['title' => 'Checkout', 'content' => '<!-- wp:shortcode -->[woocommerce_checkout]<!-- /wp:shortcode -->', 'option' => 'woocommerce_checkout_page_id'],
|
||||
'my-account' => ['title' => 'My Account', 'content' => '<!-- wp:shortcode -->[woocommerce_my_account]<!-- /wp:shortcode -->', 'option' => 'woocommerce_myaccount_page_id'],
|
||||
];
|
||||
|
||||
foreach ($wc_pages as $slug => $data) {
|
||||
// Check if page is already assigned in WC options
|
||||
$existing_id = get_option($data['option']);
|
||||
if ($existing_id && get_post($existing_id)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if page exists by slug
|
||||
if (self::page_exists($slug)) {
|
||||
$page = get_page_by_path($slug);
|
||||
update_option($data['option'], $page->ID);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create page
|
||||
$page_id = wp_insert_post([
|
||||
'post_title' => $data['title'],
|
||||
'post_name' => $slug,
|
||||
'post_content' => $data['content'],
|
||||
'post_status' => 'publish',
|
||||
'post_type' => 'page',
|
||||
]);
|
||||
|
||||
if ($page_id && !is_wp_error($page_id)) {
|
||||
update_option($data['option'], $page_id);
|
||||
|
||||
// For Shop page, add a fallback structure (though content-product takes precedence in SPA)
|
||||
if ($slug === 'shop') {
|
||||
$structure = [
|
||||
'type' => 'page',
|
||||
'sections' => [
|
||||
[
|
||||
'id' => 'section-shop-products',
|
||||
'type' => 'content',
|
||||
'props' => [
|
||||
'content' => ['type' => 'static', 'value' => '[products limit="12" columns="4"]'],
|
||||
]
|
||||
]
|
||||
],
|
||||
'created_at' => current_time('mysql'),
|
||||
];
|
||||
update_post_meta($page_id, '_wn_page_structure', $structure);
|
||||
} else {
|
||||
// For other pages, add structre that wraps the shortcode for SPA rendering
|
||||
$structure = [
|
||||
'type' => 'page',
|
||||
'sections' => [
|
||||
[
|
||||
'id' => 'section-' . $slug,
|
||||
'type' => 'content',
|
||||
'props' => [
|
||||
'content' => ['type' => 'static', 'value' => $data['content']],
|
||||
]
|
||||
]
|
||||
],
|
||||
'created_at' => current_time('mysql'),
|
||||
];
|
||||
update_post_meta($page_id, '_wn_page_structure', $structure);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper: Check if page exists
|
||||
*/
|
||||
private static function page_exists($slug)
|
||||
{
|
||||
return !empty(get_page_by_path($slug));
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper: Insert Page and Structure
|
||||
*/
|
||||
private static function insert_page($title, $slug, $structure)
|
||||
{
|
||||
$page_id = wp_insert_post([
|
||||
'post_title' => $title,
|
||||
'post_name' => $slug,
|
||||
'post_status' => 'publish',
|
||||
'post_type' => 'page',
|
||||
]);
|
||||
|
||||
if ($page_id && !is_wp_error($page_id)) {
|
||||
update_post_meta($page_id, '_wn_page_structure', $structure);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user