Modificar páginas de taxonomía para excluir elementos en taxonomías secundarias

18

Encontré esta pregunta:

¿Hay una manera de usar $ query-> set ('tax_query' en el filtro pre_get_posts?

lo que parece indicar que sí, puede modificar la consulta de taxonomía en los archivos de taxonomía a través de pre_get_posts (). entonces se me ocurrió

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {  
  if( is_tax() ) {
     $wp_query->tax_query->queries[0]['include_children'] = 0;
  }
}

tanto como

add_action('pre_get_posts', 'kia_no_child_terms' );

function kia_no_child_terms( $wp_query ) {
   if( is_tax() ) {
        $tax_query = $wp_query->get( 'tax_query' );
        $tax_query->queries[0]['include_children'] = 0;
    $wp_query->set( 'tax_query', $tax_query );  
    }    
}

para tratar de establecer el parámetro include_children en falso ... y casi todas las combinaciones de las dos que se me ocurren. hasta ahora, sin embargo, el archivo de taxonomía todavía muestra los elementos en el término secundario

y la siguiente prueba simplemente parece AGREGAR las consultas fiscales adicionales en lugar de sobrescribirlas ... lo que me confunde.

function dummy_test( $wp_query){
$tax_query = array(
             'relation' => 'OR',
             array(
               'taxonomy' => 'tax1',
               'terms' => array( 'term1', 'term2' ),
               'field' => 'slug',
             ),
             array(
               'taxonomy' => 'tax2',
               'terms' => array( 'term-a', 'term-b' ),
               'field' => 'slug',
             ),
           );


$wp_query->set( 'tax_query', $tax_query );

);
add_action('pre_get_posts','dummy_test');

¿No debería SET sobrescribir el valor actual?

helgatheviking
fuente
Por favor, eche un vistazo a esta respuesta . Eso debería llevarte más lejos.
kaiser
gracias, pero eso es más o menos lo que he intentado. var_dumps / print_rs de $ wp_query global muestran esa nueva consulta de impuestos además de la consulta existente en lugar de en lugar de ... al menos en mi página de taxonomía.
helgatheviking
Sí, ese código está destinado a agregar a la consulta.
kaiser
Entonces, ¿no hay forma de ajustar / anular la consulta existente? b / c lo que quiero es cambiar el parámetro include_children
helgatheviking

Respuestas:

22

Sé que esta es una vieja pregunta, pero es un poco confusa y espero que ayude a alguien. La razón por la que `$ query-> set no funciona es porque la consulta ya se ha analizado y ahora también necesitamos actualizar el objeto tax_query. Así es como lo hice:

function my_tax_query( $query ) {
    $package_id = 12345;
    $tax_query = array(
        'taxonomy' => 'package_id',
        'terms'    => array( $package_id ),
        'field'    => 'slug',
        'operator' => 'IN',
    );
    $query->tax_query->queries[] = $tax_query; 
    $query->query_vars['tax_query'] = $query->tax_query->queries;
}
add_action( 'pre_get_posts', 'my_tax_query' );
Tanner Moushey
fuente
¡¡Dulce!! Lo comprobé y pude adaptar su código para que funcione para todas las taxonomías, que era la pregunta original. +1 (te daría más votos a favor si pudiera)
helgatheviking
Me sorprendió y me tranquilizó ver que este método también funciona para consultas de fechas.
David
14

A partir de Wordpress 3.7, parse_tax_queryse agregó una nueva acción denominada exactamente para este propósito.

function kia_no_child_terms($wp_query) {  
  $wp_query->tax_query->queries[0]['include_children'] = 0;
}
add_action('parse_tax_query', 'kia_no_child_terms');

Este enlace modifica los valores de query_vars y tax_query. El uso del pre_get_postsmétodo resultó en consultas de taxonomía duplicadas, al menos para mí.

Antes de 3.7 debes usar la pre_get_postsacción, como se detalla en las otras respuestas.

potencias de sotavento
fuente
En mi caso, esto parece demasiado largo y tiene efectos secundarios no deseados ... evita que aparezcan los submenús de mi navegación.
Manu
2
@Manu: tienes toda la razón. El ejemplo proporcionado es muy simplificado y muestra solo las variables relevantes. En un escenario de la vida real, inspeccionaría $wp_query, usaría etiquetas de plantilla, o ambas, o alguna otra lógica, para determinar si la consulta debe modificarse en primer lugar.
leepowers
5

No pude lograr que esto funcione con ninguna combinación de pre_get_postso parse_query. Puedo hacerlo relativamente fácilmente borrando el objeto de consulta después de que se haya realizado. No me gusta porque entonces estoy ejecutando la consulta dos veces, pero estoy al final de mi ingenio tratando de ser "eficiente".

function kia_no_child_taxonomies(){

    if(is_tax()){
        $args = array(
            'tax_query' => array(
                array(
                    'taxonomy' => get_query_var('taxonomy'),
                    'field' => 'slug',
                    'terms' => get_query_var('term'),
                    'include_children' => FALSE
                )
            )
        );
        query_posts($args); 
    }
}

 add_action('wp','kia_no_child_taxonomies');

Entonces, hasta que alguien llegue con una mejor respuesta, este es el único método que he encontrado hasta ahora.

EDITAR:

Adaptando la respuesta de @Tanner Moushey, finalmente pude hacer que esto funcione para excluir todos los términos secundarios de un archivo de taxonomía en el pre_get_postsgancho sin la ineficiente doble consulta.

function kia_no_child_taxonomies( $query ) {

    if( is_tax() ):

    $tax_obj = $query->get_queried_object();

   $tax_query = array(
                    'taxonomy' => $tax_obj->taxonomy,
                    'field' => 'slug',
                    'terms' => $tax_obj->slug,
                    'include_children' => FALSE
            );
   $query->tax_query->queries[] = $tax_query;
   $query->query_vars['tax_query'] = $query->tax_query->queries;

   endif;

}
add_action( 'pre_get_posts', 'kia_no_child_taxonomies' );
helgatheviking
fuente
Esto está mal. No debe usar query_posts, use pre_get_posts o request en su lugar.
kovshenin
Eso no es útil. ¿por qué no publicar una respuesta si sabes cómo hacer que pre_get_posts funcione en esta instancia? Yo, obviamente, ha escrito en mi pregunta que he probado, pero llegué a la conclusión de que no puede modificar el objeto tax_Query a través de ese filtro
helgatheviking
Lo siento, debería haber sido más útil. Por lo tanto, la consulta de impuestos real se construye (con parse_tax_query) después de que se active pre_get_posts, y en un WP_Tax_Query real, que contiene todas las consultas de impuestos combinadas de las variables de consulta (incluida la consulta tax_query var), por lo que en su caso está analizando su var de consulta tax_query, y luego agregue todo lo que esté disponible a través de variables de consulta, como categoría, tag__in y otros. Puede usar pre_get_posts para eliminar las variables de consulta existentes antes de agregar las suyas propias.
kovshenin
Gracias por la mejor explicación. Obviamente esto es viejo, así que seguí con la solución que tenía. Nunca pude modificar el include_childrenparámetro a través del pre_get_postsgancho. Ah bueno.
helgatheviking
Sí, pensé, no he estado aquí por mucho tiempo;)
kovshenin
2

Para aquellos a quienes les agrado este problema, encontré algo útil. Utilicé el sistema de prioridad

    function kia_no_child_taxonomies( $query ) {

if( is_tax() ):

$tax_obj = $query->get_queried_object();
$tax_query = array(
                'taxonomy' => $tax_obj->taxonomy,
                'field' => 'slug',
                'terms' => $tax_obj->slug,
                'include_children' => FALSE);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
return $query;
endif;

}
 add_action( 'pre_get_posts', 'kia_no_child_taxonomies',0 );

Mi consulta no se incluyó en el resultado y la búsqueda se interrumpió con mis exclusiones. Espero que esto ayude.

youkoal
fuente