Статьи

Показывать связанные с WordPress сообщения с таксономией и пользовательским типом сообщения

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

Иногда вы хотите, чтобы ваши сообщения блога появлялись на большем количестве страниц вашего сайта WordPress, чем просто ваш блог.

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

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

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

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

  • Установка WordPress для разработки — не добавляйте ничего на свой сайт, пока он не заработает!
  • Редактор кода.
  • Тема, которую вы можете редактировать напрямую или тема с хуком действий после содержимого. Если вы используете стороннюю тему без хуков, вам нужно создать дочернюю тему и отредактировать ее.

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

01
02
03
04
05
06
07
08
09
10
11
<?php
/**
 * Plugin Name: Tuts+ Add Taxonomy Archive to Custom Post Types
 * Plugin URI: https://github.com/rachelmccollin/tutsplus-custom-post-type-taxonomy-archive
 * Description: Uses a custom taxonomy to add relevant blog posts to custom post type pages
 * Version: 1.0
 * Author: Rachel McCollin
 * Textdomain: tutsplus
 * Author URI: https://rachelmccollin.com
 *
 */

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

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

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

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
function tutsplus_register_product_post_type() {
     
    // book blurbs
    $labels = array(
        ‘name’ => __( ‘Products’ ),
        ‘singular_name’ => __( ‘Product’ ),
        ‘add_new’ => __( ‘New Product’ ),
        ‘add_new_item’ => __( ‘Add New Product’ ),
        ‘edit_item’ => __( ‘Edit Product’ ),
        ‘new_item’ => __( ‘New Product’ ),
        ‘view_item’ => __( ‘View Product’ ),
        ‘search_items’ => __( ‘Search Products’ ),
        ‘not_found’ => __( ‘No Products Found’ ),
        ‘not_found_in_trash’ => __( ‘No Products found in Trash’ ),
    );
    $args = array(
        ‘labels’ => $labels,
        ‘has_archive’ => true,
        ‘public’ => true,
        ‘hierarchical’ => false,
        ‘supports’ => array(
            ‘title’,
            ‘editor’,
            ‘excerpt’,
            ‘custom-fields’,
            ‘thumbnail’,
            ‘page-attributes’
        ),
        ‘rewrite’ => array( ‘slug’ => ‘product’ ),
 
    );
    register_post_type( ‘tutsplus_product’, $args );
     
}
add_action( ‘init’, ‘tutsplus_register_product_post_type’ );

Это регистрирует плагин tutsplus_product . Если вы хотите, чтобы ваш тип сообщения имел другое имя, измените код выше.

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

Тип публикации продукта в меню администратора WordPress

Следующим шагом является регистрация таксономии. Опять же, создайте еще одну функцию в вашем плагине:

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
function tutsplus_register_product_taxonomy() {
     
    // product taxonomy
    $labels = array(
        ‘name’ => __( ‘Products’, ‘tutsplus’ ),
        ‘singular_name’ => __( ‘Product’, ‘tutsplus’ ),
        ‘search_items’ => __( ‘Search Products’, ‘tutsplus’ ),
        ‘all_items’ => __( ‘All Products’, ‘tutsplus’ ),
        ‘edit_item’ => __( ‘Edit Product’, ‘tutsplus’ ),
        ‘update_item’ => __( ‘Update Product’, ‘tutsplus’ ),
        ‘add_new_item’ => __( ‘Add New Product’, ‘tutsplus’ ),
        ‘new_item_name’ => __( ‘New Product Name’, ‘tutsplus’ ),
        ‘menu_name’ => __( ‘Product Taxonomy Term’, ‘tutsplus’ ),
    );
     
    $args = array(
        ‘labels’ => $labels,
        ‘hierarchical’ => true,
        ‘sort’ => true,
        ‘args’ => array( ‘orderby’ => ‘term_order’ ),
        ‘rewrite’ => array( ‘slug’ => ‘book’ ),
        ‘show_admin_column’ => true
    );
     
    register_taxonomy( ‘tutsplus_product_tax’, array( ‘tutsplus_product’, ‘post’, ‘page’ ), $args);
         
}
add_action( ‘init’, ‘tutsplus_register_product_taxonomy’ );

Моя таксономия называется tutsplus_product_tax . Я специально включил tax поэтому я знаю, что это таксономия, а не тип поста. Я также сделал пункт меню более конкретным, чтобы любой, кто использует этот плагин в админке WordPress, знал, когда он работает с типом поста и когда он работает с таксономией.

Вот это в админке WordPress:

Список продуктов с таксономическими терминами, назначенными администратором WordPress.

На скриншоте видно, что я также добавил несколько фиктивных товаров.

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

Для этого мы будем использовать get_the_terms() . Затем мы создадим пустой массив переменных и добавим порцию каждого из терминов, извлеченных в этот массив. Затем мы можем использовать этот массив в аргументах для WP_Query .

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

1
2
3
4
5
6
7
8
function tutsplus_add_posts_to_product_pages() {
     
    // check if we’re in the product post type
    if( is_singular( ‘tutsplus_product’ ) ) {
     
    }
     
}

Внутри вашей функции (и внутри проверки на наличие одной страницы продукта) вам нужно получить список терминов таксономии для этого поста.

Добавь это:

1
$productterms = get_the_terms( get_the_ID(), ‘tutsplus_product_tax’ );

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

01
02
03
04
05
06
07
08
09
10
11
if( $productterms ) {
             
    $producttermnames[] = 0;
                     
    foreach( $productterms as $productterm ) {
                 
        $producttermnames[] = $productterm->name;
             
    }
     
}

Это выбирает кусок каждого термина и добавляет его в массив $producttermnames .

Теперь нам нужно настроить аргументы запроса. Это будет внутри вашей проверки if( $productterms ) , так как вы не хотите, чтобы она запускалась, если нет никаких условий. Добавьте это к своему коду:

01
02
03
04
05
06
07
08
09
10
$args = array (
    ‘post_type’ => ‘post’,
    ‘tax_query’ => array(
        array(
            ‘taxonomy’ => ‘tutsplus_product_tax’,
            ‘field’ => ‘slug’,
            ‘terms’ => $producttermnames,
        ),
    ),
);

Здесь мы использовали массив $producttermnames tax_query аргументах tax_query . При этом будет получено любое сообщение с любыми условиями, которые есть у этого продукта.

Теперь выполните запрос, используя эти аргументы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
if( $query->have_posts() ) { ?>
     
    <section class=»product-related-posts»>
 
    <?php echo ‘<h2>’ .
 
        <ul class=»product-posts»>
 
        <?php while ( $query->have_posts() ) : $query->the_post();
         
            <li><a href=»<?php the_permalink(); ?>»><?php the_title();
                 
            <?php endwhile;
             
            <?php wp_reset_postdata();
         
        </ul>
         
    </section>
     
<?php }

Это выведет элемент h2 с заголовком и списком ссылок на каждый пост. Если вы хотите, вы можете вывести это по-другому: возможно, добавив отрывок или рекомендуемое изображение.

Обычно вы не ожидаете, что пользователь добавит более одного термина таксономии к каждому продукту, поскольку каждый из этих терминов связан с продуктом. Но нельзя точно сказать, что этого никогда не произойдет. Вот почему функция включает этот массив $producttermslist и использует его для одного экземпляра WP_Query вместо запуска WP_Query в цикле foreach . Это также делает страницу более эффективной, поскольку она выполняет только один дополнительный запрос.

Вот функция полностью, со всеми скобками в правильном месте:

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
function tutsplus_add_posts_to_product_pages() {
     
    // check if we’re in the product post type
    if( is_singular( ‘tutsplus_product’ ) ) {
         
        // fetch taxonomy terms for current product
        $productterms = get_the_terms( get_the_ID(), ‘tutsplus_product_tax’ );
         
        if( $productterms ) {
             
            $producttermnames[] = 0;
                     
            foreach( $productterms as $productterm ) {
                 
                $producttermnames[] = $productterm->name;
             
            }
             
                         
            // set up the query arguments
            $args = array (
                ‘post_type’ => ‘post’,
                ‘tax_query’ => array(
                    array(
                        ‘taxonomy’ => ‘tutsplus_product_tax’,
                        ‘field’ => ‘slug’,
                        ‘terms’ => $producttermnames,
                    ),
                ),
            );
             
            // run the query
            $query = new WP_Query( $args );
 
            if( $query->have_posts() ) { ?>
                 
                <section class=»product-related-posts»>
             
                <?php echo ‘<h2>’ .
             
                    <ul class=»product-posts»>
             
                    <?php while ( $query->have_posts() ) : $query->the_post();
                     
                        <li><a href=»<?php the_permalink(); ?>»><?php the_title();
                             
                        <?php endwhile;
                         
                        <?php wp_reset_postdata();
                     
                    </ul>
                     
                </section>
                 
            <?php }
             
         
        }
         
    }
 
}

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

  1. Подключите его к существующему действию в вашей теме.
  2. Добавьте хук действия к своей теме, используя do_action() и подключите его к этому.
  3. Добавьте имя функции в место в вашей теме, где вы хотите выводить список.

Для второго и третьего вариантов, если вы работаете со сторонней темой, вы должны создать дочернюю тему и отредактировать ее. Вы можете либо создать файл шаблона single-tutsplus_product.php и добавить к нему хук или функцию, либо просто добавить его в single.php . Если вы подключили его к файлу шаблона для типа записи, вы можете удалить if ( is_singular( 'tutsplus_product' ) ) .

В моем случае я использую тему Suki из каталога плагинов WordPress. Он включает этот хук в файл single.php :

1
do_action( ‘suki/frontend/after_main’ );

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

1
add_action( ‘suki/frontend/after_main’, ‘tutsplus_add_posts_to_product_pages’ );

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

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

Продукты в админке WordPress

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

Список повторяющихся постов на странице товара

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