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

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

В предыдущей статье я показала, как создать архив таксономии, в котором перечислены записи по терминам таксономии.

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

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

Например, если вы создаете списки книг и статей, как списки записей различных типов, и в качестве таксономии к ним применяются одни и те же темы (например, WordPress!)

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

1. Приступаем к работе: Создание темы

Я создам тему, которая будет являться дочерней для темы twentyfourteen, так что если вы используете исходные файлы для этого урока, вам также необходимо установить на вашем сайте эту тему. В стили моей темы я добавляю следующее:

/*
Название темы:     WPTutsPlus Creating a Taxonomy Archive to List Posts by Post Type
URI-адрес темы:      http://rachelmccollin.co.uk/wptutsplus-tax-archive-by-post-type/
Описание:    Тема для создания пользовательского архива таксономии. Дочерняя для темы Twenty Fourteen.
Автор:         Рэйчел МакКоллин
Author URI:     http://rachelmccollin.co.uk/
Шаблон:       twentyfourteen
Версия:        1.0
*/

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

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

2. Регистрируем тип записи и таксономию

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

Следующим этапом будет регистрация типа записи ‘animal’ и таксономии ‘animal family’. Создайте файл functions.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' );

Затем зарегистрируйте таксономию семейств животных.

Если вы работаете с темой, созданной в предыдущей статье, вы должны будете добавить к аргументам функции array(‘animal,’post’), предназначенный только для ‘animal’:

// регистрация таксономии под названием 'Animal Family'
function wptp_register_taxonomy() {
    register_taxonomy( 'animal_cat', array( 'animal', 'post' ),
        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' );

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

Теперь добавьте данные — я добавила несколько животных и записей для семейства ‘Canines’.

3. Создание шаблона архива

Теперь создайте файл с названием taxonomy-animal_cat.php. Это будет шаблон архива для новой таксономии.

Скопируйте код оболочки из вашей темы в данный файл, так чтобы он содержал элементы и классы, общие с остальной частью темы. Я копирую их с twentyfourteen — если вы используете собственную тему, скопируйте эти элементы из нее.

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

<?php
/*
Статья по созданию архива и выводу записей по терминам таксономии.
*/
?>

<?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();

4. Определение запрашиваемого объекта

Чтобы вы могли отобразить название запрашиваемого термина и определить запросы в двух циклах, которые вы создадите, вам необходимо определить запрашиваемый объект и сохранить его в качестве переменной.

Добавьте следующий код где-нибудь в верхней части шаблона архива (я добавляю его ниже вызова get_header()):

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

Мы используем этот код на следующем этапе.

5. Вывод заголовка архива

Перед добавлением цикла необходимо вывести заголовок страницы вашего архива. Внутри дива #content добавьте следующий код:

<header class="archive-header">
    <h1 class="archive-title">
        <?php echo $term->name; ?>
        <?php //post_type_archive_title(); ?>
    </h1>
</header><!-- .archive-header -->

6. Первый цикл

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

Во-первых, определить запрос:

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

Заметьте, что здесь используется переменная $term, которую вы уже определили.

Затем добавляем цикл, выводя ссылку для каждого животного в неупорядоченном списке:

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>';

} // завершение проверки, содержатся ли записи по запросу     
// используем сброс данных записи, чтобы восстановить оригинальный запрос
 wp_reset_postdata();

?>

Важно включить в этот код два элемента:

  • проверку на наличие записей по запросу — вы ведь не хотите, чтобы в противном случае выводился просто заголовок без соответствующего списка;
  • wp_reset_postdata() для сброса запроса — вы всегда должны использовать его с WP_Query.

7. Второй цикл

Второй цикл практически идентичен первому, и отличается только аргументами запроса:

<?php //second query – posts

// Определение запроса the query
$args = array(
    'post_type' => 'post',
    'animal_cat' => $term->slug
);
$query = new WP_Query( $args );

if ($query->have_posts()) {

    // вывод названия термина в теге заголовка                
    echo'<h2>Blog Posts About the ' . $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>';

} // завершение проверки, содержатся ли записи по запросу

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

?>

Теперь сохраните файл шаблона и просмотрите архив в браузере. Вы должны увидеть два списка, один с названиями животных, другой — с записями:

Заключение

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

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

Я уверен, что вы сможете придумать и другие варианты!

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