El parámetro "tax_query" no funciona con WP_Query

16 abr 2012, 18:52:22
Vistas: 167K
Votos: 33

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.

0
Todas las respuestas a la pregunta 3
6
72

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'
    )
),
16 abr 2012 18:58:10
Comentarios

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

Josh Farneman Josh Farneman
16 abr 2012 19:19:10

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".

Chip Bennett Chip Bennett
16 abr 2012 19:21:03

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

djphinesse djphinesse
24 nov 2014 01:45:40

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

realgeek realgeek
13 abr 2018 00:22:15

¡¡Gracias amigo!! esto realmente me ayuda.

Lai32290 Lai32290
19 may 2020 23:14:57

"Array de arrays" todavía causando problemas en 2022. Jaja. Gracias por la respuesta.

Ejaz Ejaz
18 may 2022 13:17:18
Mostrar los 1 comentarios restantes
0

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'],
        ],
    ],
]);
10 dic 2021 19:20:54
0

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.

12 abr 2023 10:30:09