Пользовательский шаблон записи для определенной категории
Какой самый лучший способ (с точки зрения производительности и структуры кода) создать пользовательский шаблон для записи WordPress, которая принадлежит определенной категории? Я понял, что нельзя просто создать single-catname.php
.
Пока я попробовал два способа изменения шаблона. Но какой из них (или какой-то другой) является лучшим?
РЕДАКТИРОВАНО:
Есть ли идеи, как включить все подкатегории/родительские и так далее категории? Я только что понял, что сейчас отображается только основная категория...
1. Добавлено в functions.php
function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'movies' )) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}
add_filter( "single_template", "get_custom_cat_template" ) ;
2. Поместите следующий код в single.php (вместо всего остального кода) и создайте single-template.php
(с кодом из single.php) и пользовательский single-movies.php
<?php
if(has_term('movies', 'category', $post)) {
get_template_part('single-movies', 'movies');
} else {
// использовать шаблон по умолчанию single-template.php
get_template_part('single-template');
}
?>

Из моего комментария к автору вопроса
Мое мнение — используйте то, с чем вам удобнее работать. Если и есть разница в производительности, то она будет незначительной/несущественной. Я предпочитаю использовать фильтр.
Переходя к вашей реальной проблеме/вопросу, на мой взгляд, лучшим подходом будет использование ID родительской категории и работа от нее. Это будет наименее ресурсоемким способом. Обратный инжиниринг может стать довольно ненужной тратой ресурсов.
Используйте get_categories
для получения дочерних категорий из заданной категории. Вы можете использовать один из двух параметров: parent
или child_of
parent (целое число)
Отображает только категории, которые являются прямыми потомками (т.е. только дочерние) категории, указанной по её ID. Это НЕ работает как параметр 'child_of'. Значение по умолчанию отсутствует. [В версии 2.8.4]
child_of (целое число)
Отображает все категории, которые являются потомками (т.е. дочерние и внучатые) категории, указанной по её ID. Значение по умолчанию отсутствует. Если параметр используется, параметр hide_empty устанавливается в false.
Как только вы получите эти категории, используйте wp_list_pluck
для извлечения полей catID, name или slug из возвращенного массива категорий. Этот массив будет использоваться для проверки, принадлежит ли пост одной из этих категорий. Вы можете использовать has_category
или in_category
Вот как можно расширить ваш код, чтобы убедиться, что посты, принадлежащие либо родительской категории, либо её потомкам, используют заданный шаблон
add_filter( 'single_template', function ( $single_template ) {
$parent = '21'; // Измените на ID вашей категории
$categories = get_categories( 'child_of=' . $parent );
$cat_names = wp_list_pluck( $categories, 'name' );
if ( has_category( 'movies' ) || has_category( $cat_names ) ) {
$single_template = dirname( __FILE__ ) . '/single-movies.php';
}
return $single_template;
}, PHP_INT_MAX, 2 );

Есть какие-то отзывы по этому поводу? Было бы признательно (и вежливо), если бы вы оставляли отзывы на свои открытые вопросы. Это принесет пользу не только вам, но и другим пользователям, которые найдут ваши вопросы через поисковые системы. Просто забросить свои вопросы, как вы сделали, может привести к тому, что другие пользователи в будущем будут игнорировать ваши вопросы. Пожалуйста, помогите нам (и себе) поддерживать этот сайт и ваши вопросы конструктивными. Спасибо за понимание :-)

шаг 1: Создайте или скопируйте файл content-single.php и создайте новый файл. Например: content-yourCategory.php
шаг 2: Откройте single.php и замените строку get_template_part('content','single');
на следующий код
if(is_category('yourCategory')){
get_template_part('content','yourCategory');
}else{
get_template_part('content','single.php');
}
Параметр может быть ID категории, названием категории, ярлыком категории или массивом ID, названий и ярлыков.

Это удобный способ сделать это, найденный здесь. Вставьте этот код в ваш файл function.php
:
// Пользовательский шаблон single по категории
// https://halgatewood.com/wordpress-custom-single-templates-by-category
add_filter('single_template', 'check_for_category_single_template');
function check_for_category_single_template( $t )
{
foreach( (array) get_the_category() as $cat )
{
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
if($cat->parent)
{
$cat = get_the_category_by_ID( $cat->parent );
if ( file_exists(STYLESHEETPATH . "/single-category-{$cat->slug}.php") ) return STYLESHEETPATH . "/single-category-{$cat->slug}.php";
}
}
return $t;
}
Для получения дополнительной информации посетите https://halgatewood.com/wordpress-custom-single-templates-by-category

function get_custom_cat_template($single_template) {
global $post;
if ( in_category( 'category-name' )) {
$single_template = dirname( __FILE__ ) . '/single-template.php';
}
return $single_template;
}
add_filter( "single_template", "get_custom_cat_template" ) ;

СТАРЫЕ РЕШЕНИЯ НЕ РАБОТАЮТ С НОВЫМИ ШАБЛОНАМИ WORDPRESS (БЛОК-ШАБЛОНЫ)?
Для тех, кто попал сюда из Google после 2022 года:
Если вы работаете с блок-шаблонами — новой системой шаблонов WordPress, где файлы шаблонов имеют расширение не .php, а просто .html и содержат код блоков, вы можете использовать это решение:
Просто создайте файл single-post-[slug-категории]-article.html. Это сработает.
Если точнее, вот порядок, в котором WordPress ищет шаблоны для одиночных записей:
- single-post-[slug-категории]-article.html
- single-post.html
- single.html
