Параметр "tax_query" не работает с WP_Query

16 апр. 2012 г., 18:52:22
Просмотры: 167K
Голосов: 33

У меня есть пользовательский тип записи 'episode'. К нему прикреплена пользовательская таксономия 'video_type', которая содержит два термина: "bonus-footage" и "episode"; "episode" содержит два дочерних термина "season-1" и "season-2" (в будущем будут добавлены другие сезоны). Я хочу получить только самую последнюю запись типа 'episode', но не включать записи из термина 'bonus-footage'. Ниже код, который я использую:

<?php
$some_args = array(
    'tax_query' => array(
        'taxonomy' => 'video_type',
        'terms' => 'bonus-footage',
        'field' => 'slug',
        'include_children' => true,
        'operator' => 'NOT IN'
     ),
    'posts_per_page' => 1,
    'post_type' => 'episode',
);

$s = new WP_Query( $some_args );

if ( $s->have_posts() ) : $s->the_post();
    // Делаем что-то с этой записью
endif;
?>

Запрос работает как ожидается, если пост в одном из терминов 'season' является самым новым, но если пост в "bonus-footage" является самым новым, то загружается именно он. Другими словами, мои параметры "tax_query" не оказывают влияния на запрос. Возможно, я неправильно форматирую "tax_query" или упускаю что-то еще?

Я также пробовал установить "tax_query" следующим образом:

'tax_query' => array(
        'taxonomy' => 'video_type',
        'terms' => 'episode',
        'field' => 'slug',
        'include_children' => true,
        'operator' => 'IN'
),

но получаю тот же результат.

0
Все ответы на вопрос 3
6
72

Параметр tax_query представляет собой массив массивов, а не просто массив.

Этот код:

'tax_query' => array(
        'taxonomy' => 'video_type',
        'terms' => 'episode',
        'field' => 'slug',
        'include_children' => true,
        'operator' => 'IN'
),

Должен выглядеть так:

'tax_query' => array(
    array(
        'taxonomy' => 'video_type',
        'terms' => 'episode',
        'field' => 'slug',
        'include_children' => true,
        'operator' => 'IN'
    )
),
16 апр. 2012 г. 18:58:10
Комментарии

Спасибо, Chip. Мне интересно, почему WordPress реализовал это именно таким образом?

Josh Farneman Josh Farneman
16 апр. 2012 г. 19:19:10

Для того, чтобы можно было выполнять несколько таксономических запросов, используя булевы операторы. Смотрите связанную запись в Codex, раздел "Обработка множественных таксономий".

Chip Bennett Chip Bennett
16 апр. 2012 г. 19:21:03

Сработало идеально! Спасибо, чувак, я уже бился головой об стену с этой проблемой!

djphinesse djphinesse
24 нояб. 2014 г. 01:45:40

Не могу понять, как преобразовать это в параметр URL и заставить WP_Query действительно его использовать. Он просто игнорируется.

realgeek realgeek
13 апр. 2018 г. 00:22:15

Спасибо, чувак!! Это реально мне помогло!

Lai32290 Lai32290
19 мая 2020 г. 23:14:57

"Массив массивов" все еще создает проблемы в 2022 году. Ха-ха. Спасибо за ответ.

Ejaz Ejaz
18 мая 2022 г. 13:17:18
Показать остальные 1 комментариев
0

Также стоит обратить внимание на правильное форматирование правил:

new WP_Query([
    'post_type' => 'vehicle',
    'tax_query' => [
        'relation' => 'OR',
        [
            'taxonomy' => 'brand',
            'field' => 'slug',
            'terms' => 'bmw',
        ],
        [
            'taxonomy' => 'brand',
            'field' => 'slug',
            'terms' => 'mercedes',
        ]
    ],
]);

Таким образом вы получаете транспортные средства, у которых бренд bmw ИЛИ mercedes.

Если же вам нужно получить транспортные средства, у которых бренд bmw И mercedes:

new WP_Query([
    'post_type' => 'vehicle',
    'tax_query' => [
        [
            'taxonomy' => 'brand',
            'field' => 'slug',
            'terms' => ['bmw', 'mercedes'],
        ],
    ],
]);
10 дек. 2021 г. 19:20:54
0

Дополняя ответ @Lucas, я заметил, что мне пришлось добавить ключ: 'operator' => 'AND' внутри terms, чтобы выполнить операцию AND. В противном случае запрос все равно использует OR.

12 апр. 2023 г. 10:30:09