Запрос нескольких таксономий

9 нояб. 2014 г., 23:09:54
Просмотры: 44.5K
Голосов: 4

У меня есть функция для отображения "Похожих продуктов", которая показывает товары с одинаковым термином таксономии 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 для отображения более конкретных похожих продуктов, если это возможно. Буду признателен за любые предложения!

4
Комментарии

Добавьте еще один массив в 'tax_query' => array( это должно решить вашу проблему.

SLH SLH
9 нояб. 2014 г. 23:13:34

@SLH да, но что насчет $terms = wp_get_post_terms( $post->ID, 'products-category' );, так как это использует только термин таксономии product-category?

user1374796 user1374796
9 нояб. 2014 г. 23:29:18

Тогда создайте другую переменную $space_terms и получите термины по ID поста для вашей второй таксономии. array( 'taxonomy' => 'space', 'field' => 'slug', 'terms' => $space_terms, ),

SLH SLH
9 нояб. 2014 г. 23:32:54

@SLH окей, если только это не что-то, что я делаю неправильно...не мог бы ты, возможно, разместить полный код в ответе, чтобы я мог проверить?

user1374796 user1374796
9 нояб. 2014 г. 23:51:59
Все ответы на вопрос 2
0
16

В первую очередь, получим все слаги терминов из пользовательской таксономии 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,
    ),
),
10 нояб. 2014 г. 00:02:43
0

Сначала просто получаем все термины: Здесь я использовал пользовательский тип записи 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,
        ),
    ),

));
28 окт. 2018 г. 06:50:31