Кілька взаємозв'язків для кількох податкових запитів у 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()фільтр? Будь-яка ідея?

Відповіді:


10

Це можна зробити, скориставшись терміном_taxonomy_id, а не слизом, який ефективно ігнорує те, що вказано в таксономії, і просто подивіться на унікальне поле term_taxonomy_id. Це дозволить вам ефективно вміти робити змішані стосунки. Ви хочете використовувати загальне відношення AND і ввести всі умови, які повинні бути пов'язані АБО в один елемент, використовуючи оператор IN. Вам потрібно буде спочатку зіставити потрібні терміни до їх терміна_таксономії_ідів.

$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


6
До речі, вибачте, будь ласка, і попередити мене про будь-які помилки / неточності :) Набравши все це однією рукою з дитиною в іншій.
helenhousandi

1
Звідки береться $slug...?
vancoder

1
Просто заповнювач у коді. Я здогадуюсь, що це було $ term1 тощо в первісному питанні.
helenhousandi

Ти правий! Цей метод, здається, працює. Я дам тест і повернусь, щоб проголосувати за цю відповідь, якщо вона працює. Дякую
ron_dev

Здається, це 'taxonomy' => 'taxonomy4', // gets ignoredне можна ігнорувати. Якщо я помістив випадковий текст у це поле, результату не було знайдено. Тільки коли я призначив реальну назву таксономії, це дає мені результат. Будь-яка ідея чому?
ron_dev

1

Я sugest з використанням tax_queryяк meta_queryдля декількох або / та операторів , як це


Набагато краще пропозиція. Як це було звільнено через деякий час після відповіді вище.
FooBar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.