Привет, я довольно новичок в woocommerce. Мой магазин имеет четыре категории продуктов, которые используют один и тот же шаблон для одного продукта. Я хочу добавить пятую категорию продуктов, где макет страницы продукта сильно отличается от уже используемого.
Вот структура файла –
Я создал файл под названием content-single-product-mock.php. В single-product.php, используя следующий код
<?php if (has_term( 'mock', 'product_cat' )) { woocommerce_get_template_part( 'content', 'single-product-mock' ); } else{ wc_get_template_part( 'content', 'single-product' ); } ?>
Для категории mock она перенаправляется на content-single-product-mock.php, но использует файлы шаблонов в папке с одним продуктом. Как изменить путь шаблона в content-single-product-mock.php, чтобы он использовал настроенные файлы в папке с одним продуктом-макетом?
Вероятно, существует несколько способов сделать это, но они все обходят идею фильтрации шаблона до его включения.
Вы можете полностью пропустить шаблон simple-product.php
WooCommerce (без необходимости переопределять этот шаблон) и перейти непосредственно к simple-product-mock.php
и создать там все. Вы сделали бы это, отфильтровывая template_include
.
add_filter( 'template_include', 'so_25789472_template_include' ); function so_25789472_template_include( $template ) { if ( is_singular('product') && (has_term( 'mock', 'product_cat')) ) { $template = get_stylesheet_directory() . '/woocommerce/single-product-mock.php'; } return $template; }
Вы можете отредактировать single-product-mock.php
чтобы вызывать content-single-product-mock.php
и жесткий код этого файла. Ничто не требует от вас использовать крючки и функции Woo. Их цель – просто упростить настройку.
Или быть действительно сложным, вы можете дублировать шаблоны, такие как single-product/title.php
в single-product/title.php
с single-product-mock
… ex: single-product-mock/title.php
а затем в любое время, когда мы находимся на шаблон одного продукта в категории «макет», мы перехватим вызовы к шаблону с single-product/something.php
и перенаправим их на single-product-mock/something.php
если он существует, и продолжайте указывать на single-product/something.php
если это не так. Мы сделаем это через фильтр woocommerce_locate_template
.
add_filter( 'woocommerce_locate_template', 'so_25789472_locate_template', 10, 3 ); function so_25789472_locate_template( $template, $template_name, $template_path ){ // on single posts with mock category and only for single-product/something.php templates if( is_product() && has_term( 'mock', 'product_cat' ) && strpos( $template_name, 'single-product/') !== false ){ // replace single-product with single-product-mock in template name $mock_template_name = str_replace("single-product/", "single-product-mock/", $template_name ); // look for templates in the single-product-mock/ folder $mock_template = locate_template( array( trailingslashit( $template_path ) . $mock_template_name, $mock_template_name ) ); // if found, replace template with that in the single-product-mock/ folder if ( $mock_template ) { $template = $mock_template; } } return $template; }