El parámetro "tax_query" no funciona con WP_Query
Tengo un tipo de entrada personalizada llamada 'episode'. Adjunto a 'episode' tengo una taxonomía personalizada llamada 'video_type' que contiene dos términos: "bonus-footage" y "episode"; "episode" contiene dos términos hijo "season-1" y "season-2" (se añadirán más temporadas en el futuro). Quiero obtener solo la entrada más reciente del tipo 'episode' pero sin incluir ninguna entrada del término 'bonus-footage'. A continuación está el código que estoy usando para esto:
<?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();
// Hacer algo con esta entrada.
endif;
?>
La consulta funciona como se espera si una entrada en uno de los términos 'season' es la más nueva, pero si una entrada en "bonus-footage" es la más nueva, entonces carga esa. En otras palabras, mis parámetros "tax_query" parecen no tener efecto en la consulta. ¿No estoy formateando el "tax_query" correctamente o me estoy perdiendo algo más?
También he intentado configurar "tax_query" como se muestra a continuación:
'tax_query' => array(
'taxonomy' => 'video_type',
'terms' => 'episode',
'field' => 'slug',
'include_children' => true,
'operator' => 'IN'
),
pero sigo obteniendo el mismo resultado.

El parámetro tax_query
es un array de arrays, no solo un array.
Esto:
'tax_query' => array(
'taxonomy' => 'video_type',
'terms' => 'episode',
'field' => 'slug',
'include_children' => true,
'operator' => 'IN'
),
Debería ser esto:
'tax_query' => array(
array(
'taxonomy' => 'video_type',
'terms' => 'episode',
'field' => 'slug',
'include_children' => true,
'operator' => 'IN'
)
),

Gracias Chip. Tengo curiosidad por saber la razón por la que Wordpress lo tiene construido de esta manera.

Para que se puedan realizar múltiples consultas de taxonomía, utilizando booleanos. Consulta la entrada del Codex enlazada, en la sección "Manejo de múltiples taxonomías".

¡Funcionó perfectamente para mí! Gracias colega, ¡me estaba rompiendo la cabeza con esto!

No logro entender cómo traducir esto a un parámetro de URL y que WP_Query lo utilice realmente. Simplemente sigue siendo ignorado.

También vale la pena prestar atención si estás formateando las reglas correctamente:
new WP_Query([
'post_type' => 'vehicle',
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'brand',
'field' => 'slug',
'terms' => 'bmw',
],
[
'taxonomy' => 'brand',
'field' => 'slug',
'terms' => 'mercedes',
]
],
]);
De esta forma estás obteniendo vehículos que sean de la marca bmw
O mercedes
.
Si quieres obtener vehículos que sean de la marca bmw
Y mercedes
:
new WP_Query([
'post_type' => 'vehicle',
'tax_query' => [
[
'taxonomy' => 'brand',
'field' => 'slug',
'terms' => ['bmw', 'mercedes'],
],
],
]);

Agregando a la respuesta de @Lucas, noté que tuve que agregar la clave: 'operator' => 'AND' bajo terms para realizar la operación AND. De lo contrario, la consulta sigue haciendo OR.
