Параметр "tax_query" не работает с WP_Query
У меня есть пользовательский тип записи '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'
),
но получаю тот же результат.

Параметр 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'
)
),

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

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

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

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

Также стоит обратить внимание на правильное форматирование правил:
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'],
],
],
]);

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