Запрос нескольких таксономий
У меня есть функция для отображения "Похожих продуктов", которая показывает товары с одинаковым термином таксономии products-category
. Это отлично работает, но я хочу сузить функцию еще больше и сделать ее более специфичной. Поэтому я хочу, чтобы она проверяла 2 таксономии (product-category
и space
) для поиска похожих продуктов. Текущий код выглядит следующим образом:
<?php
$terms = wp_get_post_terms( $post->ID, 'products-category' );
if($terms){
// запись имеет прикрепленные термины course_type
$course_terms = array();
foreach ($terms as $term){
$course_terms[] = $term->slug;
}
$original_query = $wp_query;
$wp_query = null;
$wp_query = new WP_Query(
array(
'posts_per_page' => '4',
'post_type' => 'regularproducts',
'tax_query' => array(
array(
'taxonomy' => 'products-category',
'field' => 'slug',
'terms' => $course_terms, //термины таксономии, которые я хотел бы динамически запрашивать
),
),
'orderby' => 'title',
'order' => 'ASC',
)
);
if ( have_posts() ): ?>
<?php while (have_posts() ) : the_post(); ?> //и так далее...
Итак, в настоящее время он проверяет только таксономию products-category
для похожих продуктов (записей), но я хочу, чтобы он проверял ОБЕ таксономии product-category
и space
для отображения более конкретных похожих продуктов, если это возможно. Буду признателен за любые предложения!

В первую очередь, получим все слаги терминов из пользовательской таксономии space
по ID текущей записи.
$space_terms = wp_get_post_terms( $post->ID, 'space' );
if( $space_terms ) {
$space_terms = array();
foreach( $space_terms as $term ) {
$space_terms[] = $term->slug;
}
}
Необходимо указать логическое соотношение между каждым внутренним массивом таксономии, когда их больше одного.
Ключ relation
в массиве описывает это соотношение. Возможные значения: OR
(ИЛИ) и AND
(И).
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'products-category',
'field' => 'slug',
'terms' => $course_terms,
),
array(
'taxonomy' => 'space',
'field' => 'slug',
'terms' => $space_terms,
),
),

Сначала просто получаем все термины: Здесь я использовал пользовательский тип записи property в качестве примера
$property_statu_terms = wp_get_post_terms( $post->ID, 'property_status', array( 'fields' => 'ids' ));
$property_type_terms = wp_get_post_terms( $post->ID, 'property_type', array( 'fields' => 'ids' ));
$property_city_terms = wp_get_post_terms( $post->ID, 'property_city', array( 'fields' => 'ids' ));
$property_state_terms = wp_get_post_terms( $post->ID, 'property_state', array( 'fields' => 'ids' ));
$property_feature_terms = wp_get_post_terms( $post->ID, 'property_feature', array( 'fields' => 'ids' ));
Используйте параметр relation
со значением [OR] или [AND] для получения нужных записей.
$query = new WP_Query( array(
'post_type' => 'property',
'posts_per_page' => 3,
'orderby' => 'rand',
'post__not_in' => array( $post->ID ),
'ignore_sticky_posts' => 1,
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'property_status',
'field' => 'id',
'terms' => $property_statu_terms,
),
array(
'taxonomy' => 'property_type',
'field' => 'id',
'terms' => $property_type_terms,
),
array(
'taxonomy' => 'property_city',
'field' => 'id',
'terms' => $property_city_terms,
),
array(
'taxonomy' => 'property_state',
'field' => 'id',
'terms' => $property_state_terms,
),
array(
'taxonomy' => 'property_feature',
'field' => 'id',
'terms' => $property_feature_terms,
),
),
));
