Статьи

Создание списка постов с теми же категориями, что и текущий

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

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

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

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

Чтобы следовать этому уроку, вам понадобятся:

  • установка для разработки WordPress
  • существующая тема с single.php шаблона single.php
  • редактор кода

Давайте начнем с настройки плагина. Создайте новый файл для вашего плагина — я называю мой tutsplus-related-posts.php .

В ваш новый файл добавьте следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
/**
 * Plugin Name: Tuts+ Related Posts
 * Plugin URI: http://code.tutsplus.com/tutorials/creating-a-list-of-posts-with-the-same-categories-as-the-current-one—cms-22626
 * Description: This plugin identifies what categories the current post is in and outputs a list of the most recent posts in the same categories.
 * Version: 1.0.0
 * Author: Rachel McCollin
 * Author URI: http://rachelmccollin.com
 * License: GPL-3.0+
 * License URI: http://www.gnu.org/licenses/gpl-3.0.html
 * Domain Path: /lang
 * Text Domain: tutsplus
 */

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

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

Начните с создания функции для хранения вашего кода вместе с несколькими инициализациями:

1
2
3
4
5
6
function tutsplus_related_posts() {
 
    $post_id = get_the_ID();
    $cat_ids = array();
 
}

Теперь внутри вашей функции используйте функцию get_the_category() чтобы получить массив данных, относящихся к категориям, в которых находится текущее сообщение:

1
$categories = get_the_category( $post_id );

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

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

1
2
3
4
5
6
7
8
9
if ( $categories && ! is_wp_error( $categories ) ) {
         
    foreach ( $categories as $category ) {
 
        array_push( $cat_ids, $category->term_id );
 
    }
     
}

Давайте посмотрим, что делает этот код:

  • Сначала он проверяет, что $categories не возвратил ноль или ошибку.
  • Затем для каждой категории он добавляет идентификатор в массив.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
function tutsplus_related_posts() {
 
    $post_id = get_the_ID();
    $cat_ids = array();
    $categories = get_the_category( $post_id );
 
    if ( $categories && !is_wp_error( $categories ) ) {
 
        foreach ( $categories as $category ) {
 
            array_push( $cat_ids, $category->term_id );
 
        }
 
    }
 
}

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

Еще в вашей функции, установите аргументы для запроса:

1
2
3
4
5
6
7
8
$current_post_type = get_post_type( $post_id );
     
$args = array(
    ‘category__in’ => $cat_ids,
    ‘post_type’ => $current_post_type,
    ‘posts_per_page’ => ‘5’,
    ‘post__not_in’ => array( $post_id )
);

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

Теперь запустите запрос:

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
$query = new WP_Query( $args );
 
if ( $query->have_posts() ) {
 
    ?>
    <aside class=»related-posts»>
        <h3>
            <?php _e( ‘Related Posts’, ‘tutsplus’ );
        </h3>
        <ul class=»related-posts»>
            <?php
 
                while ( $query->have_posts() ) {
 
                    $query->the_post();
 
                    ?>
                    <li>
                        <a href=»<?php the_permalink(); ?>»>
                            <?php the_title();
                        </a>
                    </li>
                    <?php
 
                }
 
            ?>
        </ul>
    </aside>
    <?php
 
}
 
wp_reset_postdata();

Это выводит заголовки постов внутри ссылок на них в виде списка.

Последний шаг — добавить функцию в файл шаблона в вашей теме. Я создал single.php тему для темы Twenty Fourteen с новым файлом single.php , и я добавляю функцию там, под контентом. Его можно добавить куда угодно, если оно находится в пост-цикле WordPress.

В файл шаблона добавьте следующее:

1
tutsplus_related_posts();

Вы можете увидеть результат ниже:

Конец сообщения со списком из пяти связанных сообщений, показанных внизу

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

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

Чтобы идентифицировать теги вместо категорий, вы должны заменить функцию get_the_tags() , а затем заменить аргумент 'category__in' для запроса на 'tag__in' .

Чтобы определить термины таксономии, вы должны использовать get_the_terms() вместо get_the_category() , добавив в качестве второго параметра get_the_category() таксономии. Затем вы заменили бы аргумент 'tax_query' аргументом, используя 'tax_query' .

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

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

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