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?


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

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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.