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

Но что, если вы хотите, чтобы ваш главный архив записей определенного типа стал более удобным? В этой статье я покажу, как создать страницу архива для записей пользовательского типа, которая отображает записи данного типа, с разбивкой по категориям таксономии.
Таким образом, вместо одного длинного списка посетители будут видеть список по каждому термину таксономии.
Что вам потребуется
Для работы с этой статьей вам понадобится установленная и настроенная система WordPress и редактор кода. Вы будете создавать тему, которая является дочерней для темы twentyfourteen, так что вам нужно ее установить (она является темой WordPress по умолчанию).
Я не буду показывать вам, как создается дочерняя тема, но если это для вас проблема, просто взгляните на таблицу стилей в подборке кодов для этой статьи.
1. Приступаем к работе: регистрация типа записи и таксономии
По моему опыту эта техника используется чаще для записей пользовательского типа и таксономии, чем для стандартных записей и категорий или тегов, так что я начну с регистрации типа записи и таксономии.
Примечание: Я использую тот же тип записей ‘animal’, который я зарегистрировала в предыдущей статье по созданию иллюстрированных архивов. Если вы захотите создать более продвинутый набор инструментов, вы можете объединить технику, описанную в той статье, с техникой, которую я покажу вам здесь, и выводить списки терминов таксономии на своем сайте с характерными изображениями.
В файл функций вашей темы добавьте следующий код, чтобы зарегистрировать тип записей:
// регистрируем пользовательский тип записей 'animals'
function wptp_create_post_type() {
$labels = array(
'name' => __( 'Animals' ),
'singular_name' => __( 'animal' ),
'add_new' => __( 'New animal' ),
'add_new_item' => __( 'Add New animal' ),
'edit_item' => __( 'Edit animal' ),
'new_item' => __( 'New animal' ),
'view_item' => __( 'View animal' ),
'search_items' => __( 'Search animals' ),
'not_found' => __( 'No animals Found' ),
'not_found_in_trash' => __( 'No animals found in Trash' ),
);
$args = array(
'labels' => $labels,
'has_archive' => true,
'public' => true,
'hierarchical' => false,
'supports' => array(
'title',
'editor',
'excerpt',
'custom-fields',
'thumbnail',
'page-attributes'
),
'taxonomies' => array( 'post_tag', 'category'),
);
register_post_type( 'animal', $args );
}
add_action( 'init', 'wptp_create_post_type' );
Затем добавьте код для регистрации таксономии:
// регистрируем таксономию 'Animal Family'
function wptp_register_taxonomy() {
register_taxonomy( 'animal_cat', 'animal',
array(
'labels' => array(
'name' => 'Animal Families',
'singular_name' => 'Animal Family',
'search_items' => 'Search Animal Families',
'all_items' => 'All Animal Families',
'edit_item' => 'Edit Animal Families',
'update_item' => 'Update Animal Family',
'add_new_item' => 'Add New Animal Family',
'new_item_name' => 'New Animal Family Name',
'menu_name' => 'Animal Family',
),
'hierarchical' => true,
'sort' => true,
'args' => array( 'orderby' => 'term_order' ),
'rewrite' => array( 'slug' => 'animal-family' ),
'show_admin_column' => true
)
);
}
add_action( 'init', 'wptp_register_taxonomy' );
После того, как вы это сделали, добавьте в эти разделы некоторые данные. Ниже вы можете видеть данные, которые я добавила для применяемых терминов таксономии.
Я не особо забочусь о достоверности моих данных, в частности принадлежности некоторых животных к определенным семействам, поэтому, пожалуйста, не пишите в комментариях, что у меня что-то неправильно!

2. Настройка шаблона архива
Следующий шаг заключается в создании шаблона архива для нового типа записей. В вашей теме создайте новый файл под названием archive-animal.php.
Так как эта тема является дочерней для темы twentyfourteen, для шаблона архива потребуется код, скопированный из этой темы в качестве оболочки для пользовательского цикла, который вы собираетесь создать.
Так что добавьте в шаблон архива следующие строки:
<?php
/*
Пособие по созданию архива для вывода записей по терминам таксономии
Шаблон архива для записей пользовательского типа animal
*/
?>
<?php get_header(); ?>
<div id="main-content" class="main-content">
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<header class="archive-header">
<h1 class="archive-title">
<?php post_type_archive_title(); ?>
</h1>
</header><!-- .archive-header -->
</div><!-- #content -->
</div><!-- #primary -->
<?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->
<?php
get_sidebar();
get_footer();
Примечание: Если вы работаете с собственной темой, скопируйте код оболочки из индексного файла или файла архива темы.
3. Заполнение шаблона архива: выборка терминов таксономии
Так как в архиве могут выводиться животные по терминам таксономии, следующим шагом, будет выборка этих терминов.
В вашем новом файле шаблона, ниже закрывающегося тега </header> (или ниже открывающей части кода оболочки, если вы используете собственную тему), введите термины, используя get_terms():
<?php //начало выборки терминов для таксономии animal_cat
$terms = get_terms( 'animal_cat', array(
'orderby' => 'count',
'hide_empty' => 0
) );
?>
Обратите внимание, что я использовала здесь два параметра:
- orderby — позволяет указать порядок отображения терминов. Я использовала значение count, так что термин с наибольшим количеством переданных ему записей будет отображаться первым, но вы можете задать порядок сортировки по имени или ID — если оставить это поле пустым, WordPress будет выдавать значения по имени. Для более подробной информации ознакомьтесь с разделом кодекса по get_terms();
- hide_empty — указывает WordPress не выбирать термины, без назначенных им записей. При этом если вы позже зададите тот же запрос, будет осуществляться проверка, не появились ли новые записи.
4. Заполнение шаблона архива: определение запроса
Сделав это, вы используете foreach(), чтобы указать WordPress перебрать каждый из этих терминов и выполнить запрос, который необходимо определить.
Ниже кода, который вы только что добавили, вставьте следующие строки:
<?php
// теперь выполняется запрос для каждого семейства животных
foreach( $terms as $term ) {
// Определение запроса
$args = array(
'post_type' => 'animal',
'animal_cat' => $term->slug
);
$query = new WP_Query( $args );
}
Это указывает WordPress перебрать каждый термин, а затем определить запрос — он должен запускаться каждый раз. Аргументы для запроса включают тип записей и термин в таксономии ‘animal_cat’, который является значением переменной $term.
5. Заполнение шаблона архива: добавление цикла
Определив запрос, вам нужно добавить цикл. Сначала добавляется вывод в качестве заголовка названия запрашиваемого термина. Ниже строки, которая начинается с $query, но внутри фигурных скобок оператора foreach добавьте эту строку:
echo'<h2>' . $term->name . '</h2>';
Затем добавьте код, чтобы выводить записи списком:
// вывод списком заголовков записей
echo '<ul>';
echo '</ul>';
Теперь внутри списка добавьте цикл:
// Начало цикла
while ( $query->have_posts() ) : $query->the_post(); ?>
<li class="animal-listing" id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile;
Как вы можете видеть, это просто цикл, который выводит название каждого поста внутри ссылки на запись, и не выводит выдержки. Если хотите, вы можете добавить здесь выдержку или характерное изображение.
И в конце ниже строки, считывающей echo ‘</ul>’;, сбрасывается запрос с помощью wp_reset_postdata().
Весь цикл
Вот, как теперь будет выглядеть запрос и цикл:
<?php
// теперь выполняется запрос для каждого семейства животных
foreach( $terms as $term ) {
// Определение запроса
$args = array(
'post_type' => 'animal',
'animal_cat' => $term->slug
);
$query = new WP_Query( $args );
// вывод названий записей в тегах заголовков
echo'<h2>' . $term->name . '</h2>';
// вывод списком заголовков записей
echo '<ul>';
// Начало цикла
while ( $query->have_posts() ) : $query->the_post(); ?>
<li class="animal-listing" id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</li>
<?php endwhile;
echo '</ul>';
// используем сброс данных записи, чтобы восстановить оригинальный запрос
wp_reset_postdata();
} ?>
Теперь сохраните файл шаблона и просмотрите архив данного типа записей. Вы увидите, что посты в нем выводятся по терминам таксономии, а не одним длинным списком.
Заключение
- вызвать категории или метки вместо терминов. Для этого вам нужно использовать get_categories() или get_tags();
- вместо того чтобы создавать пользовательский архив для типа записей, вы можете использовать эту технику в файле index.php для вывода записей по категориям, тегам или терминам таксономии;
- вместо того чтобы запускать один цикл для каждого термина, запустить два: первый может отображать самую последнюю запись с этим термином в полном объеме, а второй — список всех остальных записей. Для этого используйте в аргументах запроса posts_per_page и offset — подробнее узнать, как это работает, вы можете в разделе кодекса WP_Query;
- использовать posts_per_page, чтобы ограничить число отображаемых записей. Таким образом, каждый список будет иметь одинаковую длину. Вы можете совместить это со стилем для отображения списков горизонтально рядом друг с другом;
- для каждого термина, добавить ссылку на страницу архива термина после списка записей — это особенно полезно, если в вашем списке вы не отображаете все записи. Для этого используйте get_term_link().