Modificar páginas de taxonomia para excluir itens em taxonomias filho

18

Encontrei esta pergunta:

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

o que parece indicar que sim, você pode alterar a consulta de taxonomia nos 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;
  }
}

assim 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 como false ... e praticamente todas as combinações das duas que eu consigo pensar. até agora, no entanto, o arquivo de taxonomia ainda mostra os itens no termo filho

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

SET não deve substituir o valor atual?

helgatheviking
fonte
Por favor, dê uma olhada nesta resposta . Isso deve lhe trazer ainda mais.
kaiser 23/02
obrigado, mas isso é praticamente o que eu tentei. var_dumps / print_rs do global $ wp_query estão mostrando que uma nova consulta de imposto além da consulta existente em vez de no lugar de ... pelo menos na minha página de taxonomia.
23412 helgatheviking
Sim, esse código deve ser adicionado à consulta.
Kaiser
então não há como ajustar / substituir a consulta existente? b / c que eu quero é para alterar o parâmetro include_children
helgatheviking

Respostas:

22

Eu sei que essa é uma pergunta antiga, mas é um pouco confusa e espero que ajude alguém. O motivo de `$ query-> set não funcionar é porque a consulta já foi analisada e agora precisamos também atualizar o objeto tax_query também. Aqui está como eu fiz isso:

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
fonte
Doce!! Fiz uma verificação e fui capaz de adaptar seu código para trabalhar com todas as taxonomias, que era a pergunta original. +1 (eu daria a você mais
votos positivos
Fiquei surpreso e aliviado ao ver que esse método também funciona para consultas de data.
David
14

A partir do Wordpress 3.7, uma nova ação chamada parse_tax_queryfoi adicionada exatamente para esse fim.

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 gancho modifica os valores de query_vars e tax_query. O uso do pre_get_postsmétodo resultou em consultas duplicadas de taxonomia, pelo menos para mim.

Antes da versão 3.7, você deve usar a pre_get_postsação, conforme detalhado nas outras respostas.

leepowers
fonte
No meu caso, isso parece muito abrangente e tem efeitos colaterais indesejados ... impede que os submenus da minha navegação apareçam.
Manu
2
@Manu - você está completamente correto. O exemplo fornecido é muito simplificado e mostra apenas as variáveis ​​relevantes. Em um cenário da vida real, você deve inspecionar $wp_query, usar tags de modelo, ou ambas, ou alguma outra lógica, para determinar se a consulta deve ser modificada em primeiro lugar.
leepowers
5

Não consegui fazer isso funcionar com nenhuma combinação de pre_get_postsou parse_query. Eu posso fazer isso de maneira relativamente fácil, apagando o objeto de consulta depois que ele é feito. Não gosto, porque então estou executando a consulta duas vezes, mas estou no limite de tentar 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');

Então, até que alguém encontre uma resposta melhor, esse é o único método que encontrei até agora.

EDITAR:

Adaptando a resposta de @Tanner Moushey, finalmente consegui fazer esse trabalho excluir todos os termos filhos de um arquivo de taxonomia no pre_get_postsgancho sem a ineficiente consulta dupla.

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
fonte
Isto está errado. Você não deve usar query_posts, use pre_get_posts ou solicitar.
procurando
isso não ajuda. por que não postar uma resposta, se você sabe como fazer pre_get_posts funcionar nesta instância? Eu, obviamente, postou a minha pergunta que eu tentei, mas chegou à conclusão de que você não pode modificar o objeto tax_Query através desse filtro
helgatheviking
Desculpe, deveria ter sido mais útil. Portanto, a consulta tributária real é criada (com parse_tax_query) após o lançamento de pre_get_posts e em um WP_Tax_Query real, que contém todas as consultas tributárias combinadas das variáveis ​​de consulta (incluindo a consulta tax_query var), portanto, no seu caso, está analisando sua consulta tax_query var e anexando o que mais estiver disponível por meio de vars de consulta, como categoria, tag__in e outros. Você pode usar pre_get_posts para remover os vars de consulta existentes antes de adicionar os seus.
kovshenin
Obrigado pela melhor explicação. Obviamente, isso é antigo, então segui em frente com a solução que tinha. Eu nunca fui capaz de modificar o include_childrenparâmetro através do pre_get_postsgancho. Ah bem.
helgatheviking
Sim, eu pensei, não estive aqui por um longo tempo;)
kovshenin
2

Para aqueles que como eu estavam presos a esse problema, encontrei algo útil. Eu usei o sistema prioritário

    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.

youkoal
fonte