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