Архивы таксономии: Вывод списка постов по терминам таксономии

Содержание

Что вы будете создавать

По умолчанию, 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().
Меню