Несколько отношений для нескольких tax_query в WP_Query

10

Я хочу использовать WP_Query()класс для фильтрации некоторых моих сообщений. Проблема, с которой я сейчас сталкиваюсь - это обработка запроса таксономии. Обычно WP_Query()единственное отношение обрабатывается только для одного tax_query()(И или ИЛИ), но что мне нужно, так это смешанное использование этих отношений tax_query(), как этого достичь?
например

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term)
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => 'terms' => array( $term3),
            'operator' => 'IN',
        )
       // below i want to use OR relationship
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4)
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => 'terms' => array( $term2),
            'operator' => 'IN',
        )
    )  

Я знаю, что приведенный выше код не работает, мне нужно использовать WP_Query()фильтр, чтобы сделать это? Есть идеи?

ron_dev
источник

Ответы:

10

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

$taxes = array( 'taxonomy1', 'taxonomy2', 'taxonomy3', 'taxonomy4' );

foreach ( $taxes as $tax ) {
    $terms = get_terms( $tax );

    foreach ( $terms as $term )
        $tax_map[$tax][$term->slug] = $term->term_taxonomy_id;
}


$args['tax_query'] => array(
    'relation' => 'AND',
    array(
        'taxonomy' => 'taxonomy1',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy1'][$slug] )
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy3',
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy3'][$slug] ),
        'operator' => 'IN',
    ),
    array(
        'taxonomy' => 'taxonomy4', // gets ignored
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

Обратите внимание, что до 3.5 вам также нужно будет указать 'include_children' => false. Смотрите этот билет Trac для получения дополнительной информации: https://core.trac.wordpress.org/ticket/21228

helenhousandi
источник
6
Кстати, прошу прощения и предупредите меня о любых ошибках / неточностях :) Вводим все это одной рукой с ребенком в другую.
helenhousandi,
1
Откуда $slugвзялся ...?
ванкодер
1
Просто заполнитель в коде. Я предполагаю, что это было $ term1 и т. Д. В исходном вопросе.
helenhousandi,
Ты прав! Этот метод, кажется, работает. Я проверю его и вернусь, чтобы проголосовать за этот ответ, если он работает. Спасибо
ron_dev
Кажется, это 'taxonomy' => 'taxonomy4', // gets ignoredнельзя игнорировать. Если я поместил случайный текст в это поле, результат не был найден. Только когда я назначил реальное название таксономии, это дало мне результат. Есть идеи почему?
ron_dev
1

Я рекомендую использовать tax_queryкак meta_queryдля нескольких или / и таких операторов, как это

Максим Кулеа
источник
Намного лучше предложение. Как это было выпущено спустя некоторое время после ответа.
FooBar