Создание single.php для конкретной категории по ID

18 нояб. 2014 г., 15:04:02
Просмотры: 14.1K
Голосов: 0

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

Я пробовал множество решений, которые нашел в интернете, включая это, но ни одно из них не сработало для меня.

1
Комментарии

Или вы можете использовать только single.php и в содержимом регулировать вывод с помощью условного оператора (например, <?php if ( in_category(20) ) { ?>).

Aibrean Aibrean
5 авг. 2015 г. 17:05:16
Все ответы на вопрос 4
15

Вы можете использовать эту функцию для добавления шаблонов отдельных записей для определенных категорий на вашем сайте. Этот код нужно поместить в файл 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' );
18 нояб. 2014 г. 15:13:10
Комментарии

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

Pieter Goosen Pieter Goosen
18 нояб. 2014 г. 15:33:01

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

cybmeta cybmeta
18 нояб. 2014 г. 15:38:05

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

Robert hue Robert hue
18 нояб. 2014 г. 15:39:36

Спасибо, ребята! Я попробовал применить этот код, но у меня всё равно не работает.

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

Netsh Netsh
18 нояб. 2014 г. 21:10:27

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

Robert hue Robert hue
18 нояб. 2014 г. 21:28:22

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

Netsh Netsh
18 нояб. 2014 г. 23:18:53

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

Netsh Netsh
19 нояб. 2014 г. 00:52:17

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

Marcin Marcin
19 нояб. 2014 г. 09:54:52

@Netsh пожалуйста, проверь Edit 2 для точного ответа.

Robert hue Robert hue
19 нояб. 2014 г. 10:00:23

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

Marcin Marcin
19 нояб. 2014 г. 11:05:35

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

Netsh Netsh
19 нояб. 2014 г. 11:48:45

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

Robert hue Robert hue
20 нояб. 2014 г. 11:21:28

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

Netsh Netsh
20 нояб. 2014 г. 21:55:22

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

Pieter Goosen Pieter Goosen
1 янв. 2016 г. 22:15:00

Я попробовал этот код. Обнаружил, что get_template_directory() получает путь родительской темы, а не дочерней. Поэтому он не может найти новый файл шаблона.

Nora McDougall-Collins Nora McDougall-Collins
17 мар. 2021 г. 18:21:05
Показать остальные 10 комментариев
1

Используйте фильтр 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; // Возвращаем стандартный шаблон
}
18 нояб. 2014 г. 15:56:10
Комментарии

Можно получить обратную связь? Что не так с моим ответом? Если вы ставите минус, пожалуйста, добавьте комментарий.

Marcin Marcin
19 нояб. 2014 г. 08:47:31
0

Вы можете использовать фильтр 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;
});
6 мар. 2016 г. 07:29:07
0

Стоит отметить, что если вы используете дочернюю тему, то для получения шаблона отдельной записи категории следует использовать следующий код.

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' );
26 нояб. 2018 г. 01:08:10