Múltiples relaciones para múltiples tax_query en WP_Query

18 abr 2013, 19:44:01
Vistas: 46K
Votos: 14

Quiero usar la clase WP_Query() para filtrar algunos de mis posts. El problema que enfrento ahora es manejar la consulta de taxonomía. Normalmente, WP_Query() solo maneja una relación para tax_query() (ya sea AND u OR), pero lo que necesito es usar de forma mixta estas relaciones en el tax_query(), ¿cómo puedo lograrlo?
Por ejemplo:

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term )
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => array( $term3 ),
            'operator' => 'IN',
        )
       // aquí abajo quiero usar la relación OR
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4 )
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => array( $term2 ),
            'operator' => 'IN',
        )
    )  

Sé que el código anterior no funciona, ¿necesito usar el filtro de WP_Query() para hacerlo? ¿Alguna idea?

0
Todas las respuestas a la pregunta 2
10
17

Esto se puede hacer utilizando el term_taxonomy_id en lugar del slug, lo que efectivamente ignorará cualquier taxonomía especificada y solo mirará el campo único term_taxonomy_id. Esto te permitirá efectivamente poder hacer una relación mixta. Querrás usar una relación general de AND y poner todos los términos que deben estar relacionados OR en un elemento usando el operador IN. Primero necesitarás mapear los términos deseados a sus term_taxonomy_ids.

$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', // se ignora
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

Ten en cuenta que antes de la versión 3.5, también necesitarías especificar 'include_children' => false. Consulta este ticket de Trac para más información: https://core.trac.wordpress.org/ticket/21228

19 abr 2013 02:16:32
Comentarios

Por cierto, disculpa y avísame si hay algún error/inexactitud :) Estoy escribiendo todo esto con una mano mientras sostengo a mi bebé con la otra.

helenhousandi helenhousandi
19 abr 2013 02:19:09

¿De dónde viene $slug...?

vancoder vancoder
19 abr 2013 02:45:25

Solo un marcador de posición en el código. Supongo que era $term1, etc. en la pregunta original.

helenhousandi helenhousandi
19 abr 2013 02:47:20

¡Tienes razón! Este método parece funcionar. Lo probaré y volveré para votar por esta respuesta si funciona. Gracias

ron_dev ron_dev
19 abr 2013 06:22:11

Parece que el 'taxonomy' => 'taxonomy4', // se ignora no puede ignorarse. Si pongo texto aleatorio en este campo, no se encontraron resultados. Solo cuando asigné un nombre de taxonomía real, me dio el resultado. ¿Alguna idea de por qué?

ron_dev ron_dev
19 abr 2013 12:39:50

Probablemente verifica si la taxonomía existe en algún punto del proceso.

helenhousandi helenhousandi
19 abr 2013 17:39:55

Pero por lo que vi en https://core.trac.wordpress.org/ticket/21228 y https://core.trac.wordpress.org/changeset/21552, no debería verificar la taxonomía cuando existe 'term_taxonomy_id', ¿verdad?

ron_dev ron_dev
20 abr 2013 10:49:34

Después de intentarlo muchas veces, sigue sin funcionar, creo que este método no está funcionando... después de revisar la Clase WP_TAX_QUERY en https://core.trac.wordpress.org/browser/trunk/wp-includes/taxonomy.php?rev=21552, descubrí que todavía es necesario verificar el nombre de la taxonomía antes de poder usar term_taxonomy_id para este propósito (corríjanme si estoy equivocado), por lo que el nombre de la taxonomía debe existir en el array tax_query. Por lo tanto, este método no puede resolver el problema. ¿Alguna otra sugerencia para solucionar este problema?

ron_dev ron_dev
23 abr 2013 07:43:41

Bien, finalmente escribí esto (y lo publiqué): http://10up.com/blog/wordpress-mixed-relationship-taxonomy-queries/ - básicamente, sí, tienes que usar un nombre de taxonomía válido, pero el resto sigue en pie.

helenhousandi helenhousandi
17 dic 2013 01:02:17

Jesús, esto es ridículo que algo así no esté en la documentación de WP. Gracias por escribir, si la misma consulta no funciona para otros campos como lo hace para term_taxonomy_id, ¿por qué diablos siquiera soportan lo primero?

jmcgrory jmcgrory
5 mar 2022 23:28:55
Mostrar los 5 comentarios restantes
2

Sugiero usar tax_query como el meta_query para múltiples operadores or/and como este

5 nov 2015 13:00:22
Comentarios

Sugerencia mucho mejor. Ya que fue publicada algún tiempo después de la respuesta anterior.

FooBar FooBar
12 feb 2020 13:04:22

¿meta_query te permite filtrar por taxonomía? No veo dónde especificar el tipo de taxonomía

LTroya LTroya
9 ago 2022 05:56:56