Modifique páginas de taxonomia para excluir itens em taxonomias infantis

15

Eu encontrei esta pergunta:

Theres uma maneira de usar $ query- > set ('tax_query' no filtro pre_get_posts?

que parece indicar que sim, você pode alterar a consulta de taxonomia em arquivos de taxonomia via pre_get_posts (). então eu vim com

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;
  }
}

bem 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 tentar definir o parâmetro include_children para false ... e quase todas as combinações das quais eu consigo pensar. No entanto, até agora, o arquivo de taxonomia ainda está mostrando os itens no termo filho

e o teste a seguir parece apenas adicionar as consultas fiscais adicionais em vez de sobrescrevê-las ... o que apenas 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');

não deveria SET sobrescrever o valor atual?

    
por helgatheviking 22.02.2012 / 21:04

4 respostas

4

Eu não consegui fazer isso funcionar com qualquer combinação de pre_get_posts ou parse_query. Eu posso fazê-lo de forma relativamente fácil, eliminando o objeto de consulta depois que ele é feito. Eu não gosto disso b / c, então eu estou executando a consulta duas vezes, mas eu estou no fim da minha sagacidade com a tentativa 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');

até que alguém apareça com uma resposta melhor, esse é o único método que encontrei até agora.

EDITAR:

Adaptando a resposta do @Tanner Moushey, finalmente consegui fazer com que esse trabalho excluísse todos os termos filhos de um arquivo de taxonomia no pre_get_posts hook sem a consulta dupla ineficiente.

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

Eu sei que esta é uma pergunta antiga, mas é um pouco confusa e espero que ajude alguém. A razão pela qual '$ query- > set não funciona é porque a consulta já foi analisada e agora precisamos também atualizar o objeto tax_query também. Aqui está como eu fiz:

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' );
    
por Tanner Moushey 03.05.2013 / 01:15
12

A partir do Wordpress 3.7, uma nova ação chamada parse_tax_query foi adicionada exatamente para essa finalidade.

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');

Esse gancho modifica os valores de query_vars e tax_query. O uso do método pre_get_posts resultou em consultas de taxonomia duplicadas, pelo menos para mim.

Antes de 3.7, você deve usar a ação pre_get_posts , conforme detalhado nas outras respostas.

    
por leepowers 10.04.2014 / 22:32
2

para quem gosta de mim ficou preso com esse problema, achei algo útil. Eu usei o sistema de prioridade

    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 );

minha consulta não foi incluída no resultado e a pesquisa foi interrompida com minhas exclusões. espero que isso ajude

    
por youkoal 06.05.2017 / 14:52