Иногда вы хотите, чтобы ваши сообщения блога появлялись на большем количестве страниц вашего сайта 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, вы увидите свой тип сообщения в меню:
Регистрация таксономии
Следующим шагом является регистрация таксономии. Опять же, создайте еще одну функцию в вашем плагине:
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:
На скриншоте видно, что я также добавил несколько фиктивных товаров.
Создание запроса
Теперь самое интересное. Нам нужно написать функцию, которая будет извлекать термины таксономии в нашей новой таксономии для продукта, а затем выводить список постов, которые также имеют этот термин.
Для этого мы будем использовать 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 }
}
}
}
|
Запуск функции
Прямо сейчас эта функция ничего не сделает. Чтобы запустить его, вам нужно сделать одну из трех вещей:
- Подключите его к существующему действию в вашей теме.
- Добавьте хук действия к своей теме, используя
do_action()
и подключите его к этому. - Добавьте имя функции в место в вашей теме, где вы хотите выводить список.
Для второго и третьего вариантов, если вы работаете со сторонней темой, вы должны создать дочернюю тему и отредактировать ее. Вы можете либо создать файл шаблона 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 , но я также добавил еще один термин, чтобы продемонстрировать это:
Я добавил эти два условия ко многим публикациям на моем сайте, и когда вы просматриваете страницу продукта для виджета, вы можете увидеть список связанных постов внизу из обоих терминов:
Этот список публикаций поможет посетителям сайта получить доступ к публикациям в блогах, касающихся этого продукта, и побудит их узнать больше об этом и (надеюсь) купить.