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

15

J'ai trouvé cette question:

Theres un moyen d'utiliser $ query- > set ('tax_query' dans le filtre pre_get_posts?

qui semble indiquer qu'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;
  }
}

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

pour 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?

    
posée helgatheviking 22.02.2012 - 21:04

4 réponses

4

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 qu'il est créé. je n'aime pas ça b / c alors je lance 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.

EDIT:

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' );
    
réponse donnée helgatheviking 24.02.2012 - 02:11
17

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' );
    
réponse donnée Tanner Moushey 03.05.2013 - 01:15
12

À 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 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 la version 3.7, vous devez utiliser l'action pre_get_posts , comme indiqué dans les autres réponses.

    
réponse donnée leepowers 10.04.2014 - 22:32
2

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'a pas été incluse dans le résultat et la recherche a été interrompue avec mes exclusions. espérons que cela aidera

    
réponse donnée youkoal 06.05.2017 - 14:52

Lire d'autres questions sur les étiquettes