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

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

Архивы таксономий: Отображение списка записей таксономии по терминам второй таксономии
Что мы будем создавать

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

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

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

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

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

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

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

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

/*Theme Name: WPTutsPlus Create a Taxonomy Archive to List Posts by a Second Taxonomy's TermsTheme 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 McCollinAuthor URI: http://rachelmccollin.co.uk/Template:    twentyfourteenVersion:        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 --><?phpget_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 :

Архивы таксономий: Отображение списка записей таксономии по терминам второй таксономии

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

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

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

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

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

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

Заключение

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *