WooCommerce – Как создать несколько шаблонов одного продукта на основе категории?

Привет, я довольно новичок в woocommerce. Мой магазин имеет четыре категории продуктов, которые используют один и тот же шаблон для одного продукта. Я хочу добавить пятую категорию продуктов, где макет страницы продукта сильно отличается от уже используемого.

Вот структура файла –

  • Тема / WooCommerce / монопродуктовый /
  • Тема / WooCommerce / монопродуктового-макет /
  • Тема / WooCommerce / монопродуктовая-макет / title.php
  • Тема / WooCommerce / контент-монопродуктовый-mock.php
  • Тема / WooCommerce / сингл-product.php

Я создал файл под названием 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; }