Relación múltiple para múltiples tax_query en WP_Query

10

Quiero usar la WP_Query()clase para filtrar algunas de mis publicaciones. El problema que estoy enfrentando ahora es manejar la consulta de taxonomía. Normalmente, el WP_Query()único manejo de una relación para tax_query()(ya sea AND u OR), pero lo que necesito es el uso mixto de estas relaciones en el tax_query(), ¿cómo puedo lograrlo?
p.ej

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term)
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => 'terms' => array( $term3),
            'operator' => 'IN',
        )
       // below i want to use OR relationship
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4)
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => 'terms' => array( $term2),
            'operator' => 'IN',
        )
    )  

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

ron_dev
fuente

Respuestas:

10

Esto se puede hacer utilizando el term_taxonomía_id en lugar de la babosa, que ignorará efectivamente la taxonomía especificada y solo mirará el campo único term_taxonomía_id. Esto le permitirá poder efectivamente hacer una relación mixta. Desea utilizar una relación general de AND y poner todos los términos que deberían estar relacionados con OR en un elemento utilizando el operador IN. Deberá asignar los términos deseados a sus term_taxonomy_ids primero.

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

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

helenhousandi
fuente
66
Por cierto, disculpe y avíseme de cualquier error / inexactitud :) Escribiendo todo esto con una mano con un bebé en la otra.
helenhousandi
1
¿De dónde $slugviene ...?
vancoder
1
Solo un marcador de posición en el código. Supongo que era $ term1 etc. en la pregunta original.
helenhousandi
¡Tienes razón! Este método parece funcionar. Lo probaré y volveré a votar por esta respuesta si está funcionando. Gracias
ron_dev
Parece 'taxonomy' => 'taxonomy4', // gets ignoredque no se puede ignorar. Si pongo texto aleatorio en este campo, no se encontró ningún resultado. Solo cuando asigné el nombre real de la taxonomía, me dio el resultado. ¿Alguna idea de por qué?
ron_dev
1

Sugiero usar tax_querycomo meta_querypara múltiples o operadores como este

Maxime Culea
fuente
Mucho mejor sugerencia. Como fue lanzado algún tiempo después de la respuesta anterior.
FooBar