get_main_id(); $template_type = get_post_meta($post_id, Meta::TEMPLATE_TYPE, true); if (empty($template_type) || get_post_type($post_id) !== Meta::POST_TYPE) { return $url; } $template_data = explode(Builder_Template_Helper::separator(), $template_type); if (count($template_data) < 2) { return $url; } $post_type = $template_data[0]; $template_slug = $template_data[1]; // Get template URL based on template type $template_url = ''; // Check for product category first if ($template_slug === 'product-category') { $product_cats = get_terms([ 'taxonomy' => 'product_cat', 'hide_empty' => true, 'number' => 1, ]); if (!empty($product_cats) && !is_wp_error($product_cats)) { $template_url = get_term_link($product_cats[0]); } } // Check for product tag elseif ($template_slug === 'product-tag') { $product_tags = get_terms([ 'taxonomy' => 'product_tag', 'hide_empty' => true, 'number' => 1, ]); if (!empty($product_tags) && !is_wp_error($product_tags)) { $template_url = get_term_link($product_tags[0]); } } elseif ($template_slug === 'shop' || $template_slug === 'archive') { $template_url = get_permalink(wc_get_page_id('shop')); } elseif ($template_slug === 'single' && $post_type === 'product') { $page_settings_manager = \Elementor\Core\Settings\Manager::get_settings_managers('page'); $page_settings_model = $page_settings_manager->get_model($post_id); $sample_product = $page_settings_model->get_settings('usk_builder_sample_post_id'); $template_url = !empty($sample_product) ? get_permalink($sample_product) : $this->get_default_product_url(); } elseif ($template_slug === 'cart') { $template_url = wc_get_cart_url(); } elseif ($template_slug === 'checkout') { $template_url = wc_get_checkout_url(); } elseif ( $template_slug === 'myaccount' || $template_slug === 'login' || strpos($template_slug, 'myaccount-') === 0 ) { $template_url = get_permalink(wc_get_page_id('myaccount')); } elseif ($template_slug === 'order-received') { $orders = wc_get_orders(['limit' => 1]); if (!empty($orders)) { $order = $orders[0]; $order_id = $order->get_id(); $template_url = add_query_arg('order-received', $order_id, wc_get_checkout_url()); } } if (empty($template_url)) { return $url; } $is_demo = apply_filters('ultimate_store_kit/preview/use_demo_bypass', false); $nonce_value = $is_demo ? 'verified' : wp_create_nonce('template_preview_' . $post_id); $param = [ 'usk_template_id' => $post_id, 'preview_nonce' => $nonce_value, 'preview' => true ]; // Add parameters two URL $url = add_query_arg($param, $template_url); return $url; } public function my_custom_fonts() { if (is_admin() && Plugin::instance()->editor->is_edit_mode()) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only check on whether a builder template is open; only enqueues a style. if (isset($_REQUEST['usk-template'])) { wp_register_style('usk-template-builder-hide-preview-btn-inline', false); // phpcs:ignore wp_enqueue_style('usk-template-builder-hide-preview-btn-inline'); wp_add_inline_style( 'usk-template-builder-hide-preview-btn-inline', '#elementor-panel-footer-saver-preview {display:none!important}' ); } } } function set_sample_post() { if (Builder_Template_Helper::isTemplateEditMode()) { $object = \UltimateStoreKit\Includes\Builder\Builder_Post_Singleton::instance(); $object::set_sample_post(); } } function register_document_controls($document) { if ( ! $document instanceof \Elementor\Core\DocumentTypes\PageBase || ! $document::get_property('has_elements') ) { return; } if (Plugin::instance()->preview->is_preview_mode()) return; if (! Builder_Template_Helper::isTemplateEditMode()) { return; } global $post; if (! isset($post->ID)) { return; } $meta = get_post_meta($post->ID); $templateMeta = usk_optional($meta)[Meta::TEMPLATE_TYPE]; if (! isset($templateMeta[0])) { return; } $postMeta = $templateMeta[0]; $postMeta = explode('|', $postMeta); $postType = $postMeta[0]; if ($postMeta[1] != 'single') { return; } $document->start_controls_section( 'usk_page_setting_preview', [ 'label' => esc_html__('Builder Settings', 'ultimate-store-kit'), 'tab' => Controls_Manager::TAB_SETTINGS, ] ); $document->add_control( 'usk_builder_sample_post_id', [ 'label' => __('Builder Post', 'ultimate-store-kit'), 'type' => Dynamic_Select::TYPE, 'multiple' => false, 'label_block' => true, 'query_args' => [ 'post_type' => $postType ], ] ); $document->add_control( 'usk_builder_sample_apply_preview', [ 'type' => Controls_Manager::BUTTON, 'label' => esc_html__('Apply & Preview', 'ultimate-store-kit'), 'label_block' => true, 'show_label' => false, 'text' => esc_html__('Apply & Preview', 'ultimate-store-kit'), 'separator' => 'none', 'event' => 'ultimateStoreKitBuilderSetting:applySinglePagePostOnPreview', ] ); $document->end_controls_section(); } /** * Rewrite default template * */ function set_builder_template($template) { if (Builder_Template_Helper::isTemplateEditMode()) { return $this->setBackendTemplate($template); } else { return $this->setFrontendTemplate($template); } } protected function setBackendTemplate($template) { return $template; } protected function setFrontendTemplate($template) { if (get_post_type() == 'product') { global $product; $product = wc_get_product(); } if (defined('ELEMENTOR_PATH')) { $elementorTem = ELEMENTOR_PATH . "modules/page-templates/templates/"; $elementorTem = explode($elementorTem, $template); if (count($elementorTem) == 2) { return $template; } } if (is_post_type_archive('product') || is_page(wc_get_page_id('shop')) || is_product_taxonomy()) { $template_type = 'shop'; if (is_tax('product_cat')) { $template_type = 'category'; } elseif (is_tax('product_tag')) { $template_type = 'tag'; } if ($custom_template = $this->get_template_id($template_type)) { $this->current_template_id = $custom_template; return $this->getTemplatePath('woocommerce/archive-product', $template); } } if ( is_cart() ) { $cart_template = $this->resolve_cart_template( $template ); if ( $cart_template ) { return $cart_template; } } if (is_order_received_page()) { if ($custom_template = $this->get_template_id('order-received', 'product')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('woocommerce/order-received', $template); } } if (is_checkout()) { if ($custom_template = $this->get_template_id('checkout', 'product')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('woocommerce/checkout', $template); } } if (is_single() && get_post_type() == 'product') { if ($custom_template = $this->get_template_id('single', 'product')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('woocommerce/single-product', $template); } } if (is_account_page()) { global $wp; $query_vars = WC()->query->get_query_vars(); /** * Add wishlist endpoint */ $query_vars['wishlist'] = 'wishlist'; $endpoint_match = array_intersect_key($wp->query_vars, $query_vars); // Logged-out visitors landing on /my-account/ (no endpoint) see the // single Login & Register template, which is responsible for both // authentication flows. WooCommerce's own form-login.php renders // the login and registration forms on the same URL, so one // template covers both intents. if (! is_user_logged_in() && empty($endpoint_match)) { if ($custom_template = $this->get_template_id('login', 'account')) { $this->current_template_id = $custom_template; if ($newTemplate = $this->getTemplatePath('woocommerce/login')) { return $newTemplate; } return $this->getTemplatePath('woocommerce/my-account', $template); } } if ($endpoint = $endpoint_match) { $endpoint = array_key_first($endpoint); if ($endpoint && $custom_template = $this->get_template_id($endpoint, 'account')) { $this->current_template_id = $custom_template; if ($newTemplate = $this->getTemplatePath("woocommerce/{$endpoint}")) { return $newTemplate; } return $this->getTemplatePath("woocommerce/my-account", ''); } if ($custom_template = $this->get_template_id('myaccount-orders', 'account')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('woocommerce/my-account', $template); } } else { if ($custom_template = $this->get_template_id('myaccount', 'account')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('woocommerce/my-account', $template); } } } if (is_single()) { if ($custom_template = $this->get_template_id('single', 'post')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('single-post', $template); } } if (is_archive()) { if ($custom_template = $this->get_template_id('archive', 'post')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('archive-post', $template); } } if (is_home()) { if ($custom_template = $this->get_template_id('home', 'post')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('home', $template); } } if ($page_Id = intval(get_option('bdt_usk_compare_products_page_id'))) { if (is_page($page_Id)) { if ($custom_template = $this->get_template_id('compare-products', 'product')) { $this->current_template_id = $custom_template; return $this->getTemplatePath('home', $template); } } } return $template; } public function getThemeTemplatePath($slug) { $fullPath = get_template_directory() . "/ultimate-store-kit/$slug"; if (file_exists($fullPath)) { return $fullPath; } } public function getPluginTemplatePath($slug) { $fullPath = BDTUSK_PATH . "includes/builder/templates/$slug"; if (file_exists($fullPath)) { return $fullPath; } } /** * Get Template Path ID * * @param $slug * @param $postType * * @return mixed|void|null */ public function get_template_id($slug, $postType = false) { // If we already have a template ID for this request, return it if (null !== $this->current_template_id) { return $this->current_template_id; } // Handle template preview from URL parameters if (!empty($_GET['preview']) && !empty($_GET['usk_template_id']) && !empty($_GET['preview_nonce'])) { $usk_template_id = sanitize_text_field(wp_unslash($_GET['usk_template_id'])); $nonce = sanitize_text_field(wp_unslash($_GET['preview_nonce'])); // Special handling for demo bypass $is_demo_bypass = ($nonce === 'verified'); $nonce_verified = $is_demo_bypass ? apply_filters('ultimate_store_kit/preview/verified_bypass', false) : wp_verify_nonce($nonce, 'template_preview_' . $usk_template_id); if ($nonce_verified) { // For demo bypass mode, we don't need to check template type if ($is_demo_bypass) { $this->current_template_id = (int)$usk_template_id; return $this->current_template_id; } // For normal preview, check template type $template_type = get_post_meta($usk_template_id, Meta::TEMPLATE_TYPE, true); if (!empty($template_type)) { $template_data = explode(Builder_Template_Helper::separator(), $template_type); if (count($template_data) >= 2 && $template_data[1] === $slug && ($postType === false || $template_data[0] === $postType)) { $this->current_template_id = (int)$usk_template_id; return $this->current_template_id; } } } } // Regular template retrieval $templateId = Builder_Template_Helper::getTemplate($slug, $postType); $this->current_template_id = apply_filters('ultimate-store-kit-builder/custom-shop-template', $templateId); return $this->current_template_id; } /** * Get Template Path * * @param $slug * @param $default * * @return mixed|string|void */ protected function getTemplatePath($slug, $default = '') { $phpSlug = "{$slug}.php"; if ($template = $this->getThemeTemplatePath($phpSlug)) { return $template; } if ($template = $this->getPluginTemplatePath($phpSlug)) { return $template; } return $default; } /** * Resolve the plugin cart template for WooCommerce cart requests. * * @param string $template Default WordPress template path. * @return string|false */ protected function resolve_cart_template( $template ) { if ( ! Cart_Render::is_available() ) { return false; } $custom_template = $this->get_template_id( 'cart', 'product' ); $this->current_template_id = $custom_template ? absint( $custom_template ) : null; return $this->getTemplatePath( 'woocommerce/cart', $template ); } /** * Get default product URL with proper error checking * * @return string */ protected function get_default_product_url() { $products = wc_get_products(['status' => 'publish', 'limit' => 1]); if (!empty($products) && isset($products[0]) && is_object($products[0])) { $product = $products[0]; if (method_exists($product, 'get_id')) { return get_permalink($product->get_id()); } } // Fallback to shop page if no products found return get_permalink(wc_get_page_id('shop')); } } Builder_Integration::instance();