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

СКАЧАТЬ ИСХОДНЫЕ ФАЙЛЫ | ПОСМОТРЕТЬ ДЕМО

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

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

Если для классификации информации на вашем сайте используется несколько таксономий, вам может пригодиться возможность разделения записей в архиве таксономии по терминам второй таксономии.

В этой статье я покажу вам, как создать страницу таксономии, на которой записи будут выводиться в соответствии с терминами второй таксономии, к которой они также принадлежат.

Затем я создам второй архив таксономии для второй таксономии, на которой записи будут выводиться уже в соответствии с терминами первой таксономии.

Что нам понадобится:

  • Установленная система WordPress;
  • Редактор кода.

1. Создание темы

Для этой статьи я создам дочернюю тему twentyfourteen с двумя новыми файлами шаблонов, стилями и файлом функций. Если вы работаете со своей собственной темой, просто скопируйте код в файл функций вашей темы и добавьте файлы шаблонов.

Чтобы создать тему, я помещаю в пустой папке темы файл с именем style.css и добавляю в него следующий код:

/*
Theme Name:     WPTutsPlus Create a Taxonomy Archive to List Posts by a Second Taxonomy's Terms
Theme URI:      http://rachelmccollin.co.uk/wptutsplus-taxonomy-archive-list-by-second-taxonomy/
Description:    Theme to support WPTutsPlus tutorial on creating a custom taxonomy archive. Child theme for the Twenty Fourteen theme.
Author:         Rachel McCollin
Author URI:     http://rachelmccollin.co.uk/
Template:       twentyfourteen
Version:        1.0
*/

@import url("../twentyfourteen/style.css");

Таким образом, мы создадим дочернюю тему.

2. Регистрация типа записей и таксономий

Для этой статьи я буду использовать тот же тип записей ‘animals’ и таксономию ‘animal_cat’, которые я использовала в статье о создании шаблона пользовательского типа записей. Я также добавлю еще одну таксономию под названием ‘habitat’.

Для этого я создаю новый файл с именем functions.php. Во-первых, я добавляю функцию, чтобы зарегистрировать мой тип записей:

<?php
// регистрируем пользовательский тип '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' );
?>

После этого я регистрирую две таксономии в одной функции:

<?php
// Регистрируем таксономии
function wptp_register_taxonomies() {

    // Регистрируем таксономию 'Animal Family'
    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
        )
    );

    // Регистрируем таксономию 'Habitat'
    register_taxonomy( 'habitat', 'animal',
        array(
            'labels' => array(
                'name'              => 'Habitats',
                'singular_name'     => 'Habitat',
                'search_items'      => 'Search Habitats',
                'all_items'         => 'All Habitats',
                'edit_item'         => 'Edit Habitat',
                'update_item'       => 'Update Habitat',
                'add_new_item'      => 'Add New Habitat',
                'new_item_name'     => 'New Habitat Name',
                'menu_name'         => 'Habitat',
            ),
            'hierarchical' => true,
            'sort' => true,
            'args' => array( 'orderby' => 'term_order' ),
            'show_admin_column' => true
        )
    );
}
add_action( 'init', 'wptp_register_taxonomies' );
?>

Мы создали тип записей ‘animal’ и две таксономии, которые к нему применяются. Обратите внимание, что я использовала ‘show_admin_column’, чтобы позже мне было проще администрировать записи.

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

Регистрация типа записей и таксономий

3. Создание файла шаблона первой таксономии

Следующим шагом является создание файла шаблона для таксономии архива ‘animal_cat’. В папке темы создайте файл и назовите его taxonomy-animal_cat.php. Теперь добавьте в него код «обертки» из вашей темы (я скопировала его из родительской темы; если вы используете собственную тему, ваш код будет отличаться):

<?php
/*
Шаблон архива для таксономии animal_cat
*/
?>

<?php get_header(); ?>

    <div id="main-content" class="main-content">

    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">

        </div><!-- #content -->
    </div><!-- #primary -->
    <?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->

<?php
get_sidebar();
get_footer();

Определение текущего запрашиваемого термина

Для создания пользовательского запроса по каждому термину шаблон архива будет использовать WP_Query. Одним из запрашиваемых объектов будет термин текущей таксономии, который в данный момент отображается, поэтому нам нужно определить его и сохранить в качестве переменной.

Ниже строки get_header (), добавьте следующий код:

<?php
// получаем текущий запрашиваемый термин таксономии, чтобы использовать его позже в файле шаблона
$animalcat = get_queried_object();
?>

Вы можете использовать переменную $animalcat позже.

Вывод заголовка страницы

Сейчас архивы не имеют основного заголовка, так что нам нужно добавить его, используя переменную, которую мы только что определили.

После открывающегося тега <div id="content"> добавьте следующий код:

<header class="archive-header">
    <h1 class="archive-title">
        <?php echo $animalcat->name; ?>
    </h1>
</header><!-- .archive-header -->

Получение терминов второй таксономии

Далее нужно получить список терминов второй таксономии. Ниже кода, который вы только что добавили, вставьте следующие строки:

<?php //начинаем получать термины для таксономии animal_cat
$terms = get_terms( 'habitat', array(
    'hide_empty' => 0
) );
?>

Данный код получает список всех терминов и сохраняет его в массив. С помощью ‘hide_empty’ вы можете скрыть все пустые термины. Но это только предотвращает запросы терминов, к которым не принадлежит ни одна из записей, а не тех терминов, которые не назначены постам, принадлежащим запрашиваемому термину.

Создание цикла

Теперь создайте цикл, который будет запускаться для каждого термина:

<?php
// выполняем запрос для каждого семейства животных
foreach ( $terms as $term ) {

    // Определяем запрос
    $args = array(
        'post_type' => 'animal',
        'animal_cat' => $animalcat->slug,
        'habitat' => $term->slug
    );
    $query = new WP_Query( $args );

    // выводим название термина в теге заголовка                
    echo'<h2>' . $term->name . ' habitat</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>';

    // сбрасываем postdata, чтобы восстановить первоначальный запрос
    wp_reset_postdata();

} ?>

Несколько замечаний по этому коду:

  • Для каждого термина определяется новый запрос;
  • Аргументы запроса включают термин второй таксономии ($term) и текущий запрашиваемый термин ($animalcat);
  • Если таксономии применяются только к одному типу записей, мы могли бы не использовать аргумент ‘post_type’, но я предпочитаю включать его на всякий случай;
  • Переменная $term используется для вывода заголовка каждого раздела, используя $term->name.

Теперь сохраним файл шаблона и посмотрим на архив таксономии для одного из терминов Animal Family:

creating-taxonomy-archive-to-list-by-multiple-taxonomies-archive-witho

Добавление проверки записей для каждого запроса

Сейчас шаблон выводит пустой список. Но это легко исправить, проверив, содержит ли каждый запрос записи.

Оберните цикл в следующий код:

if ( $query->have_posts() ) {

}

Теперь цикл будет выглядеть следующим образом:

if ( $query->have_posts() ) {

    // выводим название термина в теге заголовка               
    echo'<h2>' . $term->name . ' habitat</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>';
}

Таким образом, цикл WordPress не будет запускаться, если запрос не содержит записей, а пустые заголовки будут удаляться. Теперь страница архива выглядит следующим образом:

Добавление проверки записей для каждого запроса

Создание файла шаблона для второй таксономии

Последним шагом является создание файла шаблона для второй таксономии.

Скопируйте первый файл шаблона и переименуйте его в taxonomy-habitat.php. Отредактируйте его, чтобы исправить терминологию. Нам нужно произвести следующие исправления:

  • откорректировать комментарии в верхней части файла;
  • изменить название переменной с $animalcat на $habitat;
  • отредактировать заголовок <h1>, чтобы для вывода имени текущего запрашиваемого термина в нем использовалась переменная $habitat;
  • изменить первый параметр функции get_terms(), чтобы в ней использовался термин animal_cat, а не habitat;
  • отредактировать аргументы запроса, поменяв значения ‘habitat’ на ‘animal_cat’;
  • отредактировать содержимое тега <h2> в цикле, чтобы оно соответствовало семействам животных, а не местам их обитания.

Новый файл шаблона будет выглядеть следующим образом:

<?php
/*
Шаблон архива для таксономии habitat
*/
?>

<?php get_header(); ?>

<?php
// получаем текущий запрашиваемый термин таксономии, чтобы использовать его позже в файле шаблона
$habitat = get_queried_object();
?>

    <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">
        Habitat - <?php echo $habitat->name; ?>
    </h1>
</header><!-- .archive-header -->

<?php //начинаем с получения терминов для таксономии animal_cat taxonomy
$terms = get_terms( 'animal_cat', array(
    'hide_empty' => 0
) );
?>

<?php
// теперь выполняем запрос для каждого семейства животных
foreach( $terms as $term ) {

    // Определяем запрос
    $args = array(
        'post_type' => 'animal',
        'animal_cat' => $term->slug,
        'habitat' => $habitat->slug
    );
    $query = new WP_Query( $args );

    if( $query->have_posts() ) {

        // выводим название термина в теге заголовка                
        echo'<h2>' . $term->name . ' family</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>';
    }

    // сбрасываем postdata, чтобы восстановить первоначальный запрос
    wp_reset_postdata();

} ?>

        </div><!-- #content -->
    </div><!-- #primary -->
    <?php get_sidebar( 'content' ); ?>
</div><!-- #main-content -->

<?php
get_sidebar();
get_footer();

После внесения этих изменений сохраните новый файл шаблона и посмотрите, как выглядит ваш архив:

как выглядит ваш архив

Теперь у вас есть страница для второй таксономии, которая работает таким же образом, как и для первой таксономии.

Заключение

Из этой статьи вы узнали, как отображать данные с использованием нескольких таксономий. Можно добавить третью таксономию одним из двух способов:

  1. Повторить процесс извлечения терминов, определения запроса и запуск цикла для третьего термина после второго, чтобы у вас получилось два отдельных списка;
  2. Свести данные с использованием всех трех условий, использовав каждую переменную $term для $habitat или $animalcat, и добавив дополнительный оператор foreach() внутри существующего оператора foreach(). В таком случае вам нужно будет подумать о том, как вывести полученные данные: списком или с помощью сетки.

Почему бы вам не попробовать это?

Перевод статьи «Taxonomy Archives: List Posts by a Second Taxonomy’s Terms» был подготовлен дружной командой проекта Сайтостроение от А до Я.