Делаем архивы категорий или таксономии иерархическими

УрокиКомментариев нет

По умолчанию архивы для категорий и других таксономий работают как и архивы любых других таксономий: они отображают все записи в категории или в термине таксономии. Для показа только элементов-родителей без показа элементов-детей можно опять использовать фильтр pre_get_posts.

Точно так же, как и при создании вашего собственного WP_QUERY для записей в таксономии, WP_QUERY главного цикла использует аргументы tax_query для получения записей таксономии. tax_query имеет аргумент include_children, который по умолчанию равен 1 или «истина». Поменяв его на 0 или «ложь», мы предотвратим отображение дочерних терминов в архиве.

<?php
    add_action( 'pre_get_posts', 'slug_cpt_category_archives' );
    function slug_cpt_category_archives( $query ) {
        if ( is_tax( 'TAXONOMY NAME') )  {
            $tax_query = $query->tax_query->queries;
            $tax_query['include_children'] = 0;
            $query->set( 'tax_query', $tax_query );
        }

    }
?>

Результаты выглядят подходящими, но имеют несколько существенных недостатков. И это нормально, ведь мы делаем только первые шаги в создании чего-то великолепного.

Первая и основная проблема в том, что результат — это не страница архива, показывающая дочерние термины; это запись с параметром родителя. Другая проблема — у нас нет нормального способа переходить к архивам дочерних терминов.

Хороший способ совладать с этим — комбинировать фильтр pre_get_post с модификацией шаблона, показывающего категорию или таксономию. Как определить, какой шаблон используется для вывода категории или пользовательской таксономии, мы выясняли выше. Также имейте в виду, что вы всегда можете обернуть ваши изменения в условные теги, такие как is_category() или is_tax(), но это может быстро стать громоздким, так что имеет смысл создать копию вашего archive.php и удалять ненужный код.

Первый шаг — обернуть всю работу в проверку, имеет ли текущая таксономия дочерние термины. Если нет — мы не отображаем ничего. Для этого используем get_term_children(), который возвратит пустой массив, если текущий термин не имеет дочерних. Этот массив мы можем проверить с помощью !empty().

Для выполнения этого для любой отображаемой таксономии, мы должны получить текущую таксономию и термин таксономии из массива query_vars глобального объекта $wp_query. Слаг таксономии содержится в ключе taxonomy, а слаг термина таксономии — в ключе tax.

Для использования get_term_children() мы должны использовать ID термина. ID нет в query_vars, но для его получения мы можем передать слаг в get_term_by().

Вот как мы получаем всю нужную информацию и сохраняем в переменные:

<?php
    global $wp_query;
    $taxonomy = $wp_query->query_vars['taxonomy'];
    $term = $wp_query->query_vars['tax'];
    $term_id = get_term_by( 'slug', $term, $taxonomy );
    $term_id = $term_id->term_id;
    $terms = get_term_children( $term_id, $taxonomy );
?>

Теперь мы продолжим, если только $terms не пустой массив. Для проверки его на пустоту мы сначала перезаполним термины, используя get_terms(). Это необходимо потому что get_term_children возвращает только массив ID, а нам нужны ID и имена, оба находятся в объекте, возвращенном get_terms(). Мы можем в цикле обойти все элементы этого объекта, и создать список, выводя имя, как ссылку. Ссылка может быть получена передачей ID термина в функцию get_term_link().

Вот весь код:

<?php
    global $wp_query;
    $taxonomy = $wp_query->query_vars['taxonomy'];
    $term = $wp_query->query_vars['tax'];
    $term_id = get_term_by( 'slug', $term, $taxonomy );
    $term_id = $term_id->term_id;
    $terms = get_term_children( $term_id, $taxonomy );
    if ( !empty( $terms ) ) {
    $terms = get_terms( $taxonomy, array( 'child_of' => $term_id ) );
    echo '<ul class="child-term-list">';
    foreach ( $terms as $term ) {
    echo '<li><a href="'.$term->term_id.'">'.$term->name.'</a></li>';
    }

    echo '</ul>';

?>

Статьи из раздела:

  1. Как работают архивы таксономий, тегов, категорий и пользовательских типов таксономий.
  2. Создание пользовательских таксономий
  3. Использование WP_Query с пользовательскими таксономиями
  4. Добавление пользовательских типов записей к архивам категорий и тегов.
  5. Создание пользовательской целевой страницы для архивов таксономий

Будь первым кто прокомментирует статью.

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

Войти с помощью: