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

15

He encontrado esta pregunta:

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

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 (). así que 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;
  }
}

así 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 intentar 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 aún muestra los elementos en el término secundario

y la siguiente prueba parece agregar las consultas de impuestos 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?

    
pregunta helgatheviking 22.02.2012 - 21:04

4 respuestas

4

No pude hacer que esto funcionara con ninguna combinación de pre_get_posts o parse_query. Puedo hacerlo de forma relativamente fácil eliminando el objeto de consulta después de que se realice. no me gusta porque estoy ejecutando la consulta dos veces, pero estoy en el extremo 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');

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

EDIT:

Adaptando la respuesta de @Tanner Moushey, finalmente pude hacer este trabajo para excluir todos los términos secundarios de un archivo de taxonomía en el gancho pre_get_posts sin la doble consulta ineficaz.

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' );
    
respondido por el helgatheviking 24.02.2012 - 02:11
17

Sé que esta es una pregunta antigua, 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' );
    
respondido por el Tanner Moushey 03.05.2013 - 01:15
12

A partir de Wordpress 3.7 se agregó una nueva acción llamada parse_tax_query 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 método pre_get_posts resultó en consultas de taxonomía duplicadas, al menos para mí.

Antes de 3.7 debe usar la acción pre_get_posts en su lugar, como se detalla en las otras respuestas.

    
respondido por el leepowers 10.04.2014 - 22:32
2

para aquellos que como yo estaban atrapados con 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 rompió con mis exclusiones. Espero que esto ayude

    
respondido por el youkoal 06.05.2017 - 14:52

Lea otras preguntas en las etiquetas