Статьи

Архивы таксономии: список сообщений по условиям второй таксономии

Конечный продукт
Что вы будете создавать

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

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

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

Когда я впервые начал работать с WordPress, я был разочарован тем, что вы не можете легко это сделать — по крайней мере, вы не можете сделать это с готовой установкой WordPress, запускающей тему по умолчанию.

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

Затем я создам второй архив таксономии для второй таксономии, в которой перечислены ее посты в порядке терминов первой таксономии (поверьте мне — это будет иметь больше смысла, когда вы увидите, как это происходит!)

Для завершения этого урока вам понадобятся:

  • установка для разработки WordPress
  • редактор кода

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

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

01
02
03
04
05
06
07
08
09
10
11
/*
Theme Name: WPTutsPlus Create a Taxonomy Archive to List Posts by a Second Taxonomy’s Terms
Theme URI: https://rachelmccollin.co.uk/wptutsplus-taxonomy-archive-list-by-second-taxonomy/
Description: Theme to support WPTutsPlus tutorial on creating a custom taxonomy archive.
Author: Rachel McCollin
Author URI: http://rachelmccollin.co.uk/
Template: twentyfourteen
Version: 1.0
*/
 
@import url(«../twentyfourteen/style.css»);

Это создает мою детскую тему.

В этом уроке я собираюсь использовать тот же тип поста 'animal_cat' таксономию 'animal_cat' которые я использовал в своем уроке при создании собственного шаблона типа поста . Я также добавлю вторую таксономию под названием 'habitat' .

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
// register a custom post type called ‘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’ );
?>

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
// register taxonomies
function wptp_register_taxonomies() {
     
    // register a taxonomy called ‘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
        )
    );
     
    // register a taxonomy called ‘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, как показано ниже.

Примечание: моя классификация животных, которую я использовал, не очень научна — пожалуйста, не комментируйте мое понимание среды обитания или семей!

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
/*
WpTutsPlus tutorial for creating archive to display posts by mutiple taxonomy terms
Archive template for animal_cat taxonomy
*/
?>
 
<?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() добавьте:

1
2
3
4
<?php
// get the currently queried taxonomy term, for use later in the template file
$animalcat = get_queried_object();
?>

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

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

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

1
2
3
4
5
<header class=»archive-header»>
    <h1 class=»archive-title»>
        <?php echo $animalcat->name;
    </h1>
</header><!— .archive-header —>

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

1
2
3
4
5
<?php //start by fetching the terms for the animal_cat taxonomy
$terms = get_terms( ‘habitat’, array(
    ‘hide_empty’ => 0
) );
?>

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
// now run a query for each animal family
foreach ( $terms as $term ) {
 
    // Define the query
    $args = array(
        ‘post_type’ => ‘animal’,
        ‘animal_cat’ => $animalcat->slug,
        ‘habitat’ => $term->slug
    );
    $query = new WP_Query( $args );
             
    // output the term name in a heading tag
    echo'<h2>’ .
     
    // output the post titles in a list
    echo ‘<ul>’;
     
        // Start the Loop
        while ( $query->have_posts() ) : $query->the_post();
 
        <li class=»animal-listing» id=»post-<?php the_ID(); ?>»>
            <a href=»<?php the_permalink(); ?>»><?php the_title();
        </li>
         
        <?php endwhile;
     
    echo ‘</ul>’;
     
    // use reset postdata to restore orginal query
    wp_reset_postdata();
 
} ?>

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

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

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

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

Оберните следующее вокруг вашей петли:

1
2
3
if ( $query->have_posts() ) {
 
}

Ваш цикл теперь будет выглядеть так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
if ( $query->have_posts() ) {
     
    // output the term name in a heading tag
    echo'<h2>’ .
     
    // output the post titles in a list
    echo ‘<ul>’;
     
        // Start the Loop
        while ( $query->have_posts() ) : $query->the_post();
 
        <li class=»animal-listing» id=»post-<?php the_ID(); ?>»>
            <a href=»<?php the_permalink(); ?>»><?php the_title();
        </li>
         
        <?php endwhile;
     
    echo ‘</ul>’;
}

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

Намного лучше!

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

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

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

Это означает, что мой новый файл шаблона выглядит так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
/*
WpTutsPlus tutorial for creating archive to display posts by mutiple taxonomy terms
Archive template for habitat taxonomy
*/
?>
 
<?php get_header();
 
<?php
// get the currently queried taxonomy term, for use later in the template file
$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 //start by fetching the terms for the animal_cat taxonomy
$terms = get_terms( ‘animal_cat’, array(
    ‘hide_empty’ => 0
) );
?>
 
<?php
// now run a query for each animal family
foreach( $terms as $term ) {
 
    // Define the query
    $args = array(
        ‘post_type’ => ‘animal’,
        ‘animal_cat’ => $term->slug,
        ‘habitat’ => $habitat->slug
    );
    $query = new WP_Query( $args );
     
    if( $query->have_posts() ) {
         
        // output the term name in a heading tag
        echo'<h2>’ .
         
        // output the post titles in a list
        echo ‘<ul>’;
         
            // Start the Loop
            while ( $query->have_posts() ) : $query->the_post();
     
            <li class=»animal-listing» id=»post-<?php the_ID(); ?>»>
                <a href=»<?php the_permalink(); ?>»><?php the_title();
            </li>
             
            <?php endwhile;
         
        echo ‘</ul>’;
    }
             
     
     
    // use reset postdata to restore orginal query
    wp_reset_postdata();
 
} ?>
             
        </div><!— #content —>
    </div><!— #primary —>
    <?php get_sidebar( ‘content’ );
</div><!— #main-content —>
 
<?php
get_sidebar();
get_footer();

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

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

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

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

Почему бы не пойти?