Статьи

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

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

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
/*
Theme Name: WPTutsPlus Creating a Taxonomy Archive to List Posts by Post Type
Theme URI: http://rachelmccollin.co.uk/wptutsplus-tax-archive-by-post-type/
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»);

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

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

Следующим шагом является регистрация типа поста «животное» и таксономия «семейство животных». Создайте файл 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
// 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’ );

Далее, ниже этого шага, зарегистрируйте таксономию семейства аминалов.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// register a taxonomy called ‘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’ );

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

Теперь добавьте некоторые данные — я добавил животных и посты в семью «Клыки».

Теперь создайте файл с именем 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
24
<?php
/*
WpTutsPlus tutorial for creating archive to display posts by taxonomy term
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();

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

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

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

Вы будете использовать это на следующем шаге.

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

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

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

Сначала определите запрос:

1
2
3
4
5
6
// Define the query
$args = array(
    ‘post_type’ => ‘animal’,
    ‘animal_cat’ => $term->slug
);
$query = new WP_Query( $args );

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

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

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
if ($query->have_posts()) {
         
    // output the term name in a heading tag
    echo'<h2>Animals in the ‘ .
     
    // 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>’;
         
} // end of check for query having posts
     
// use reset postdata to restore orginal query
wp_reset_postdata();
 
?>

Здесь важно включить две вещи:

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

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

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
<?php //second query — posts
 
// Define the query
$args = array(
    ‘post_type’ => ‘post’,
    ‘animal_cat’ => $term->slug
);
$query = new WP_Query( $args );
 
if ($query->have_posts()) {
 
         
    // output the term name in a heading tag
    echo'<h2>Blog Posts About the ‘ .
     
    // 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>’;
         
} // end of check for query having posts
     
// use reset postdata to restore orginal query
wp_reset_postdata();
 
?>

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

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

  • Изменяйте циклы так, чтобы различный контент выводился для каждого, например, выводил избранные изображения или выдержки для некоторых типов записей.
  • Добавление разных стилей для каждого типа поста.
  • Изменение макета, чтобы архивы располагались рядом или в виде сетки. Вы можете увидеть и пример сайта, где я сделал это на http://type-academy.co.uk/temperament-intro/
  • Адаптируя эту технику к архивам категорий или тегов, изменив аргументы запроса.

Я уверен, что вы можете придумать больше возможностей!