Разные шаблоны для подкатегорий
Я хочу использовать разные шаблоны для категорий и подкатегорий. Шаблон категорий установлен в файле category.php. Возможно ли как-то загружать шаблон подкатегорий из файла subcategory.php или подобного?

Иерархия шаблонов имеет фильтры для всех типов шаблонов. Здесь мы можем использовать category_template
, проверить, имеет ли текущая категория родительскую, и в таком случае загрузить файл subcategory.php
:
function wpd_subcategory_template( $template ) {
$cat = get_queried_object();
if ( isset( $cat ) && $cat->category_parent ) {
$template = locate_template( 'subcategory.php' );
}
return $template;
}
add_filter( 'category_template', 'wpd_subcategory_template' );

Думаю, это именно то, что мне нужно. Куда нужно вставить этот код?

В файл functions.php
вашей темы или в плагин.

вам просто нужно заменить subcategory.php на файл, который должен стать родительским шаблоном

@Djanym RE ваше предложенное изменение для проверки isset( $cat )
в первую очередь: я в целом ценю осторожность, но при каких обстоятельствах category_template может быть вызван, когда get_queried_object() возвращает null?

Я отредактировал ваш код, чтобы добавить больше функциональности. Для случаев, когда требуется иметь разные шаблоны для каждой дочерней категории. Например, если у вас категории организованы так:
- континент
- страна
- город
- страна
И вам нужен отдельный шаблон для города. Сначала мы проверяем, есть ли у города дочерние элементы, если нет — загружаем шаблон для города. Остальная часть кода проверяет, есть ли у категории родительская категория.
// Разные шаблоны для подкатегорий
function wpd_subcategory_template( $template ) {
$cat = get_queried_object();
$children = get_terms( $cat->taxonomy, array(
'parent' => $cat->term_id,
'hide_empty' => false
) );
if( ! $children ) {
$template = locate_template( 'category-country-city.php' );
} elseif( 0 < $cat->category_parent ) {
$template = locate_template( 'category-country.php' );
}
return $template;
}
add_filter( 'category_template', 'wpd_subcategory_template' );
