Пользовательский шаблон записи для определенной категории

29 нояб. 2014 г., 12:33:04
Просмотры: 51.4K
Голосов: 15

Какой самый лучший способ (с точки зрения производительности и структуры кода) создать пользовательский шаблон для записи 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');
}
?>
3
Комментарии

Мое мнение - используйте то, с чем вам удобнее работать. Если есть какие-то различия в производительности, они будут незначительными/несущественными. Лично я предпочитаю использовать фильтр

Pieter Goosen Pieter Goosen
29 нояб. 2014 г. 12:40:43

Спасибо за быстрый ответ. Есть идеи, как включить все дочерние/родительские и прочие категории? Только что заметил, что отображается только основная категория...

NewUser NewUser
29 нояб. 2014 г. 12:42:05

Похожий вопрос: https://wordpress.stackexchange.com/questions/61915/custom-single-post-by-category

Jesse Nickles Jesse Nickles
25 мая 2024 г. 08:53:44
Все ответы на вопрос 5
2
13

Из моего комментария к автору вопроса

Мое мнение — используйте то, с чем вам удобнее работать. Если и есть разница в производительности, то она будет незначительной/несущественной. Я предпочитаю использовать фильтр.

Переходя к вашей реальной проблеме/вопросу, на мой взгляд, лучшим подходом будет использование 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 );
29 нояб. 2014 г. 21:33:14
Комментарии

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

Pieter Goosen Pieter Goosen
14 апр. 2015 г. 09:12:15

У меня работает корректно. Спасибо!

FladeX FladeX
8 авг. 2020 г. 10:35:06
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, названий и ярлыков.

1 дек. 2014 г. 05:13:41
Комментарии

in_category() *

Avishay28 Avishay28
19 апр. 2016 г. 12:42:27

Пожалуйста, исправьте ваш ответ

Chris Pink Chris Pink
28 июн. 2024 г. 13:36:09
0

Это удобный способ сделать это, найденный здесь. Вставьте этот код в ваш файл 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

18 авг. 2017 г. 08:52:48
0
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" ) ;
24 сент. 2019 г. 11:38:02
1
-1

СТАРЫЕ РЕШЕНИЯ НЕ РАБОТАЮТ С НОВЫМИ ШАБЛОНАМИ WORDPRESS (БЛОК-ШАБЛОНЫ)?

Для тех, кто попал сюда из Google после 2022 года:

Если вы работаете с блок-шаблонами — новой системой шаблонов WordPress, где файлы шаблонов имеют расширение не .php, а просто .html и содержат код блоков, вы можете использовать это решение:

Просто создайте файл single-post-[slug-категории]-article.html. Это сработает.

Если точнее, вот порядок, в котором WordPress ищет шаблоны для одиночных записей:

  1. single-post-[slug-категории]-article.html
  2. single-post.html
  3. single.html
15 мар. 2023 г. 17:03:30
Комментарии

Не работает на версии 6.6.2

th00ht th00ht
24 сент. 2024 г. 11:01:37