Создание single.php для конкретной категории по ID
Я пытаюсь создать шаблон для конкретной категории с ID 1, например. Шаблон должен применяться ко всем страницам, принадлежащим этой категории. То есть это должно быть что-то вроде single-1.php.
Я пробовал множество решений, которые нашел в интернете, включая это, но ни одно из них не сработало для меня.

Вы можете использовать эту функцию для добавления шаблонов отдельных записей для определенных категорий на вашем сайте. Этот код нужно поместить в файл functions.php
.
Вы можете определить столько шаблонов для отдельных записей, сколько вам нужно.
function wpse_category_single_template( $single_template ) {
global $post;
$all_cats = get_the_category();
if ( $all_cats[0]->cat_ID == '1' ) {
if ( file_exists(get_template_directory() . "/single-cat1.php") ) return get_template_directory() . "/single-cat1.php";
} elseif ( $all_cats[0]->cat_ID == '2' ) {
if ( file_exists(get_template_directory() . "/single-cat2.php") ) return get_template_directory() . "/single-cat2.php";
}
return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );
Здесь я использовал single-cat1.php
для категории с ID 1 и single-cat2.php
для категории с ID 2. Вы можете назвать эти шаблоны так, как вам удобно.
Эта функция также использует стандартный шаблон single.php
в качестве запасного варианта, если файлы single-cat1.php
или single-cat2.php
не существуют.
РЕДАКТИРОВАНИЕ 1
Я использую этот код на двух своих сайтах, и он работает корректно в последней версии WordPress.
Вставьте это в ваш functions.php
:
function show_template() {
global $template;
print_r($template);
}
add_action( 'wp_head', 'show_template' );
Этот код выведет имя файла шаблона, используемого на каждой странице/записи. Теперь откройте ваш сайт и проверьте, используется ли правильный шаблон. Если по-прежнему отображается single.php
, значит, с вашим кодом что-то не так.
РЕДАКТИРОВАНИЕ 2
Вот ваш код для этого:
function wpse_category_single_template( $single_template ) {
global $post;
$all_cats = get_the_category();
if ( in_category(6) ) {
if ( file_exists(get_template_directory() . "/page-custom.php") ) {
return get_template_directory() . "/page-custom.php";
} else {
return get_template_directory() . "/page.php";
}
}
return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );

Не используйте TEMPLATEPATH
. Смотрите это

И лучше используйте locate_template()
вместо "if file_exists() then return"

@PieterGoosen только что внес это изменение. Хотя в тикете сказано, что TEMPLATEPATH
устарел, но WordPress не показывает никаких предупреждений. Спасибо :)

Спасибо, ребята! Я попробовал применить этот код, но у меня всё равно не работает.
После того как я добавил эту функцию в свой function.php и создал файл single-cat.php, связанные страницы (с тем же ID категории) остались без изменений, используя базовый шаблон single.php. Есть идеи, почему так?

@Netsh Пожалуйста, проверьте правки в моем ответе. И если проблема сохраняется, отредактируйте ваш вопрос и добавьте код, который вы вставили в ваш functions.php
.

Привет. Это была отличная идея! Спасибо! Теперь я понимаю, что мне нужно определять шаблон категории для page.php, а не для single.php. Что мне нужно изменить, чтобы код заработал у меня?

Это должно выглядеть примерно так: если ID категории страницы равен 6 - используем page-custom.php, в противном случае используем page.php

@Netsh не мог бы ты проверить мой код? Этот код не может работать, потому что Роберт предполагает, что проверяемая категория - первая, которая была назначена. Это неверно. Что если cat_ID 1 является третьим элементом в $all_cats?

@Roberthue ваш код неверен... Что если объект категории с cat_ID == 6 находится в $all_cats под индексом [1]? Что если $all_cat[0]->cat_ID == 6 возвращает false, но $all_cat[1]->cat_ID возвращает true?

Ну, во-первых, спасибо. Ценю вашу помощь! Я попробовал этот код, и он все еще не работает у меня. Похоже, что система не распознает эту функцию, и применяется стиль страницы page.php по умолчанию...

@Netsh попробуйте последний код снова и дайте мне знать, добавил предложение marcina. Он должен работать, так как я использую его на двух своих сайтах без каких-либо проблем. Также убедитесь, что никакая другая функция не перезаписывает его код/эффект.

Извините.. у меня не сработало.. но спасибо всем за усилия.. Я проверил другие функции в functions.php и не нашел проблемных функций.. Попробую в другом направлении.. Еще раз спасибо.

Почему бы не использовать in_category()
или has_category()
для проверки наличия определенной категории у записи ;-)

Используйте фильтр single_template для изменения файла шаблона и функцию in_category для проверки принадлежности записи к категории.
add_filter( 'single_template', 'my_single_template' );
function my_single_template($single_template)
{
if (in_category(1)) { // Проверяем, принадлежит ли запись к категории с ID 1
$file = get_template_directory().'/single-cat-1.php'; // Формируем путь к файлу шаблона
if ( file_exists($file) ) { // Проверяем существование файла
return $file; // Возвращаем новый шаблон
}
}
return $single_template; // Возвращаем стандартный шаблон
}

Вы можете использовать фильтр single_template
, условие in_category()
и объект запроса, чтобы проверить, относится ли текущая запись к указанной категории, и если да, подключить нужный шаблон.
add_filter( 'single_template', function ( $template )
{
// Получаем ID текущей записи
$post_id = $GLOBALS['wp_the_query']->get_queried_object_id();
// Проверяем, принадлежит ли запись к категории с ID 1
if ( !in_category( 1, $post_id ) ) {
return $template;
}
// Если запись относится к категории 1, ищем файл шаблона single-1.php
$locate_template = locate_template( 'single-1.php' );
// Проверяем существование шаблона, если найден - используем его, иначе возвращаем стандартный
if ( !$locate_template ) {
return $template;
}
return $locate_template;
});

Стоит отметить, что если вы используете дочернюю тему, то для получения шаблона отдельной записи категории следует использовать следующий код.
function wpse_category_single_template( $single_template ) {
global $post;
$all_cats = get_the_category();
if ( $all_cats[0]->slug == 'cat1' ) {
if ( file_exists(get_stylesheet_directory() . "/single-cat1.php") ) return get_stylesheet_directory() . "/single-cat1.php";
}
return $single_template;
}
add_filter( 'single_template', 'wpse_category_single_template' );
