Как отобразить родительскую и дочернюю категорию WordPress, используя другой шаблон?

Вопрос или проблема

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

Сейчас я отображаю родительские категории, и когда ссылка на родительскую категорию нажата, я использую category.php для отображения списка дочерних категорий.

Теперь я хочу, чтобы при нажатии на ссылку дочерней категории WordPress показывал все сообщения в этой дочерней категории.

Существует ли условное выражение или способ, чтобы дочерние категории переходили к archive.php, чтобы можно было отобразить что-то другое?

Сейчас родительские и дочерние категории загружаются из category.php, поэтому они оказываются на одной и той же странице.

Вы можете сделать это несколькими способами.

  1. Проверяя глубину категории/подкатегории. Если мы просматриваем основные/родительские категории, то показываем специальный шаблон, если мы находимся в подкатегориях, то показываем другой шаблон, и так далее.
  2. Можно проверить, является ли категория конечной категорией или нет. Конечная категория означает, что если у категории нет дочерних, тогда она должна показывать шаблон по умолчанию category.php.

Какой метод использовать, зависит от требований вашего проекта. Здесь я объясню первый, потому что он очень гибок и, я думаю, подойдет для ваших целей.

В WordPress есть функция template_include, которая выполняется непосредственно перед включением заранее определенного шаблонного файла. Это можно использовать для переопределения стандартного поведения шаблона WordPress.

function wpse_template_check( $template ) {
    if ( is_category() ) {
        // Получаем информацию о категории
        $cat = get_query_var( 'cat' );
        $cats_str = get_category_parents( $cat, false, '%#%' );
        $cats_array = explode('%#%', $cats_str);
        $cat_depth = sizeof( $cats_array )-2;

        // Проверка глубины категории
        $new_template = locate_template( array( 'category-custom-template.php' ) );
        if ( $cat_depth == 0 && '' != $new_template ) {
            return $new_template;
        }
    }
    return $template;
}
add_filter( 'template_include', 'wpse_template_check' );

Эта функция рассчитывает глубину категории и проверяет, является ли текущая категория основной/родительской категорией. Если это так и шаблон категории существует, то он заменит шаблон категории на category-custom-template.php.

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

Хотя вы можете настроить эту функцию для выполнения большего количества задач и в соответствии с вашими требованиями.

Я думаю, я понял, что вы имеете в виду. По умолчанию, когда категория выбрана и вы переходите на страницу категории, отображаются сообщения из текущей категории и всех ее дочерних категорий.

Так страницы категорий устроены по умолчанию. Главный запрос (который также использует WP_Query) использует tax_query для вызова сообщений из базы данных на страницах архива категорий и таксономий. tax_query на страницах категорий и таксономий одинаков, так как практически нет разницы между встроенной таксономией category и пользовательскими таксономиями. Смотрите этот пост для объяснения.

По умолчанию, если вы посмотрите на tax_query, параметр include_children установлен в true, что означает, что дочерние термины текущего запрашиваемого термина также включены. Так что вам просто нужно установить этот параметр в false. Для этого вам потребуется использовать фильтр parse_tax_query.

Вы можете сделать что-то вроде этого в вашем файле functions.php (Требуется PHP 5.3+).

add_filter( 'parse_tax_query', function ( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_category() ) {

        $query->tax_query->queries[0]['include_children'] = 0;

    }
}

Это гарантирует, что когда категория выбрана, она будет показывать только сообщения из этой конкретной категории, а не из ее дочерних категорий.

Ответ или решение

Для успешного отображения родительских и дочерних категорий в WordPress с использованием различных шаблонов, необходимо понять основные принципы управления шаблонами и работы с категориями в WordPress. В данном контексте важны знания о глубине категорий и адаптации шаблонов в зависимости от уровня категории. Давайте рассмотрим, как это можно реализовать на практике.

Теория

WordPress предоставляет множество возможностей для создания и управления категориями. По умолчанию, для отображения категорий используется шаблон category.php. Однако, чтобы повысить уровень кастомизации и отделить отображение родительских категорий от дочерних, необходимо использовать более тонкие настройки и механизмы перенаправления на определенные шаблоны.

Функция template_include — это фильтр, который позволяет изменить стандартное поведение WordPress по выбору шаблона. Применение этого фильтра дает возможность задать условие, при котором будет использоваться альтернативный шаблон для отображения конкретных категорий, основываясь на их иерархическом уровне.

Пример

Итак, для разделения отображения родительских и дочерних категорий мы будем использовать функцию wpse_template_check, которая определяется следующим образом:

function wpse_template_check( $template ) {
    if ( is_category() ) {
        // Получаем текущую категорию
        $cat = get_query_var( 'cat' );
        $cats_str = get_category_parents( $cat, false, '%#%' );
        $cats_array = explode('%#%', $cats_str);
        $cat_depth = sizeof( $cats_array ) - 2;

        // Проверяем глубину категории
        $new_template = locate_template( array( 'category-custom-template.php' ) );
        if ( $cat_depth == 0 && '' != $new_template ) {
            return $new_template;
        }
    }
    return $template;
}
add_filter( 'template_include', 'wpse_template_check' );

Этот код считывает глубину категории и применяет кастомный шаблон category-custom-template.php, если текущая категория является родительской.

Дополнительно, для управления отображением постов исключительно из текущей категории, без включения дочерних, нам понадобится изменить поведение стандартного запроса:

add_filter( 'parse_tax_query', function ( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_category() ) {
        $query->tax_query->queries[0]['include_children'] = 0;
    }
});

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

Применение

Теперь, когда у вас есть оба скрипта, вы можете интегрировать их в свой файл functions.php, что позволит:

  1. Разделить отображение родительских и дочерних категорий с использованием различных шаблонов.
  2. Настроить отображение постов так, чтобы выводились только записи из выбранной категории, исключая вложенные категории.

Эта стратегия предоставит вам достаточную гибкость в создании и управлении отношениями между шаблонами категорий в вашем WordPress-сайте. Таким образом, вы сможете создать уникальный и адаптированный под ваши нужды сайт-директорию, сохраняя при этом структуру категорий, отвечающую вашим бизнес-требованиям.

Оцените материал
Добавить комментарий

Капча загружается...