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

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

    По умолчанию архивы для категорий и других таксономий работают как и архивы любых других таксономий: они отображают все записи в категории или в термине таксономии. Для показа только элементов-родителей без показа элементов-детей можно опять использовать фильтр 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. Создание пользовательской целевой страницы для архивов таксономий

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

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

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