web-dev-qa-db-fra.com

Modifier les pages de taxonomie pour exclure les éléments des taxonomies enfants

J'ai trouvé cette question:

Y a-t-il moyen d'utiliser $ query-> set ('tax_query' dans le filtre pre_get_posts?

ce qui semble indiquer que oui, vous pouvez modifier la requête de taxonomie sur les archives de taxonomie via pre_get_posts (). donc je suis venu avec

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

aussi bien que

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

essayer de définir le paramètre include_children sur false ... et à peu près toutes les combinaisons des deux auxquelles je peux penser. jusqu'à présent cependant, les archives de taxonomie continuent d'afficher les éléments du terme enfant

et le test suivant semble simplement AJOUTER les requêtes fiscales supplémentaires au lieu de les écraser ... ce qui me rend perplexe.

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 ne doit-il pas écraser la valeur actuelle?

17
helgatheviking

je ne pouvais pas que cela fonctionne avec une combinaison quelconque de pre_get_posts ou de parse_query. Je peux le faire relativement facilement en effaçant l'objet de requête une fois celui-ci créé. je n'aime pas ça parce que j'exécute la requête deux fois, mais je suis à bout de force en essayant d'être 'efficace'

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

donc, jusqu'à ce que quelqu'un vienne avec une meilleure réponse, c'est la seule méthode que j'ai trouvée jusqu'à présent.

MODIFIER:

En adaptant la réponse de @Tanner Moushey, j'ai finalement réussi à exclure tous les termes enfants d'une archive de taxonomie sur le hook pre_get_posts sans la double requête inefficace.

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

Je sais que c'est une vieille question, mais c'est un peu déroutant et espérons pouvoir aider quelqu'un. La raison pour laquelle `$ query-> set ne fonctionne pas, c'est parce que la requête a déjà été analysée et que nous devons maintenant également mettre à jour l'objet tax_query. Voici comment je l'ai fait:

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' );
18
Tanner Moushey

À partir de Wordpress 3.7, une nouvelle action nommée parse_tax_query a été ajoutée à cette fin.

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

Ce hook modifie les valeurs de query_vars et de tax_query. L'utilisation de la méthode pre_get_posts a généré des requêtes de taxonomie en double, du moins pour moi.

Avant 3.7, vous devez utiliser l’action pre_get_posts à la place, comme indiqué dans les autres réponses.

14
leepowers

pour ceux qui, comme moi, étaient pris avec ce problème, j'ai trouvé quelque chose d'utile. j'ai utilisé le système de priorité

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

ma requête n'était pas incluse dans le résultat et la recherche était rompue avec mes exclusions. espérons que cela aidera

2
youkoal