ID == $spa_page_id) { return; } $spa_url = trailingslashit(get_permalink($spa_page_id)); // Check which WC page we're on and redirect if (is_shop()) { wp_redirect($spa_url . '#/', 302); exit; } if (is_product()) { global $product; if ($product) { $slug = $product->get_slug(); wp_redirect($spa_url . '#/products/' . $slug, 302); exit; } } if (is_cart()) { wp_redirect($spa_url . '#/cart', 302); exit; } if (is_checkout() && !is_order_received_page()) { wp_redirect($spa_url . '#/checkout', 302); exit; } if (is_account_page()) { wp_redirect($spa_url . '#/account', 302); exit; } } /** * Disable canonical redirects for SPA routes * This prevents WordPress from redirecting /product/slug URLs */ public static function disable_canonical_redirect($redirect_url, $requested_url) { $settings = get_option('woonoow_customer_spa_settings', []); $mode = isset($settings['mode']) ? $settings['mode'] : 'disabled'; // Only disable redirects in full SPA mode if ($mode !== 'full') { return $redirect_url; } // Check if this is a SPA route $spa_routes = ['/product/', '/cart', '/checkout', '/my-account']; foreach ($spa_routes as $route) { if (strpos($requested_url, $route) !== false) { // This is a SPA route, disable WordPress redirect return false; } } return $redirect_url; } /** * Use SPA template (blank page) */ public static function use_spa_template($template) { // Check if current page is a designated SPA page if (self::is_spa_page()) { $spa_template = plugin_dir_path(dirname(dirname(__FILE__))) . 'templates/spa-full-page.php'; if (file_exists($spa_template)) { return $spa_template; } } // Legacy: Check SPA mode settings $settings = get_option('woonoow_customer_spa_settings', []); $mode = isset($settings['mode']) ? $settings['mode'] : 'disabled'; // Mode 1: Disabled - but still check for shortcodes (legacy) if ($mode === 'disabled') { // Check if page has woonoow shortcodes global $post; if ( $post && ( has_shortcode($post->post_content, 'woonoow_shop') || has_shortcode($post->post_content, 'woonoow_cart') || has_shortcode($post->post_content, 'woonoow_checkout') || has_shortcode($post->post_content, 'woonoow_account') ) ) { // Use blank template for shortcode pages too $spa_template = plugin_dir_path(dirname(dirname(__FILE__))) . 'templates/spa-full-page.php'; if (file_exists($spa_template)) { return $spa_template; } } return $template; } // Check if current URL is a SPA route (for direct access) $request_uri = $_SERVER['REQUEST_URI']; $spa_routes = ['/shop', '/product/', '/cart', '/checkout', '/my-account']; $is_spa_route = false; foreach ($spa_routes as $route) { if (strpos($request_uri, $route) !== false) { $is_spa_route = true; break; } } // If it's a SPA route in full mode, use SPA template if ($mode === 'full' && $is_spa_route) { $spa_template = plugin_dir_path(dirname(dirname(__FILE__))) . 'templates/spa-full-page.php'; if (file_exists($spa_template)) { // Set status to 200 to prevent 404 status_header(200); return $spa_template; } } // Mode 3: Checkout-Only (partial SPA) if ($mode === 'checkout_only') { $checkout_pages = isset($settings['checkoutPages']) ? $settings['checkoutPages'] : [ 'checkout' => true, 'thankyou' => true, 'account' => true, 'cart' => false, ]; $should_override = false; if (!empty($checkout_pages['checkout']) && is_checkout() && !is_order_received_page()) { $should_override = true; } if (!empty($checkout_pages['thankyou']) && is_order_received_page()) { $should_override = true; } if (!empty($checkout_pages['account']) && is_account_page()) { $should_override = true; } if (!empty($checkout_pages['cart']) && is_cart()) { $should_override = true; } if ($should_override) { $spa_template = plugin_dir_path(dirname(dirname(__FILE__))) . 'templates/spa-full-page.php'; if (file_exists($spa_template)) { return $spa_template; } } return $template; } // Mode 2: Full SPA if ($mode === 'full') { // Override all WooCommerce pages if (is_woocommerce() || is_product() || is_cart() || is_checkout() || is_account_page()) { $spa_template = plugin_dir_path(dirname(dirname(__FILE__))) . 'templates/spa-full-page.php'; if (file_exists($spa_template)) { return $spa_template; } } } return $template; } /** * Start SPA wrapper */ public static function start_spa_wrapper() { // Check if we should use SPA if (!self::should_use_spa()) { return; } // Determine page type $page_type = 'shop'; $data_attrs = 'data-page="shop"'; if (is_product()) { $page_type = 'product'; global $post; $data_attrs = 'data-page="product" data-product-id="' . esc_attr($post->ID) . '"'; } elseif (is_cart()) { $page_type = 'cart'; $data_attrs = 'data-page="cart"'; } elseif (is_checkout()) { $page_type = 'checkout'; $data_attrs = 'data-page="checkout"'; } elseif (is_account_page()) { $page_type = 'account'; $data_attrs = 'data-page="account"'; } // Output SPA mount point echo '
' . esc_html__('Loading...', 'woonoow') . '
'; echo '