Múltiples relaciones para múltiples tax_query en WP_Query
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?
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

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.

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

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

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é?

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

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?

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?

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.

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