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

18

J'ai trouvé cette question:

Il existe un 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 );  
    }    
}

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 montrent toujours 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 confond.

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

helgatheviking
la source
Veuillez jeter un œil à cette réponse . Cela devrait vous amener plus loin.
kaiser
merci, mais c'est à peu près ce que j'ai essayé. var_dumps / print_rs du global $ wp_query montre cette nouvelle requête fiscale en plus de la requête existante au lieu de ... au moins sur ma page de taxonomie.
helgatheviking
Oui, ce code est destiné à s'ajouter à la requête.
kaiser
donc il n'y a aucun moyen d'ajuster / remplacer la requête existante? b / c ce que je veux est de changer le paramètre include_children
helgatheviking

Réponses:

22

Je sais que c'est une vieille question, mais c'est un peu déroutant et j'espère que cela aidera quelqu'un. La raison pour laquelle `$ query-> set ne fonctionne pas est parce que la requête a déjà été analysée et que nous devons également mettre à jour également 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' );
Tanner Moushey
la source
Sucré!! J'ai vérifié cela et j'ai pu adapter votre code pour qu'il fonctionne pour toutes les taxonomies, ce qui était la question d'origine. +1 (je vous donnerais plus de votes positifs si je le pouvais)
helgatheviking
J'ai été surpris et rassuré de voir que cette méthode fonctionne également pour les requêtes de date.
David
14

Depuis Wordpress 3.7, une nouvelle action nommée a parse_tax_queryété ajoutée exactement à cet effet.

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 pre_get_postsméthode a entraîné des requêtes de taxonomie en double, du moins pour moi.

Avant la version 3.7, vous devez utiliser l' pre_get_postsaction à la place, comme indiqué dans les autres réponses.

leepowers
la source
Dans mon cas, cela semble un peu trop profond et a des effets secondaires imprévus ... cela empêche les sous-menus de ma navigation de s'afficher.
Manu
2
@Manu - vous avez tout à fait raison. L'exemple fourni est très simplifié et ne montre que les variables pertinentes. Dans un scénario réel, vous inspecteriez $wp_query, utiliseriez des balises de modèle, ou les deux, ou une autre logique, pour déterminer si la requête devait être modifiée en premier lieu.
leepowers
5

Je ne pouvais pas faire fonctionner cela avec une combinaison de pre_get_postsou parse_query. Je peux le faire relativement facilement en effaçant l'objet de requête une fois qu'il a été créé. Je n'aime pas ça parce que j'exécute la requête deux fois, mais je suis à bout d'essayer 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.

ÉDITER:

En adaptant la réponse de @Tanner Moushey, j'ai finalement pu faire ce travail pour exclure tous les termes enfants d'une archive de taxonomie sur le pre_get_postscrochet 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' );
helgatheviking
la source
C'est faux. Vous ne devez pas utiliser query_posts, utiliser pre_get_posts ou request à la place.
kovshenin
ce n'est pas utile. pourquoi ne pas poster une réponse alors si vous savez comment faire fonctionner pre_get_posts dans ce cas? j'ai évidemment posté dans ma question que je l'ai essayé, mais je suis arrivé à la conclusion que vous ne pouvez pas modifier l'objet tax_Query via ce filtre
helgatheviking
Désolé, aurait dû être plus utile. Ainsi, la véritable requête fiscale est créée (avec parse_tax_query) après le déclenchement de pre_get_posts, et dans une WP_Tax_Query réelle, qui contient toutes les requêtes fiscales combinées à partir de variables de requête (y compris la variable de requête tax_query), donc dans votre cas, elle analyse votre variable de requête tax_query, et puis en ajoutant tout ce qui est disponible via les variables de requête, telles que category, tag__in et autres. Vous pouvez utiliser pre_get_posts pour supprimer les variables de requête existantes avant d'ajouter la vôtre.
kovshenin
Merci pour la meilleure explication. Évidemment, c'est vieux, alors j'ai continué avec la solution que j'avais. Je n'ai jamais pu modifier le include_childrenparamètre via le pre_get_postscrochet. Et bien.
helgatheviking
Ouais je me suis dit, je ne suis pas ici depuis longtemps;)
kovshenin
2

Pour ceux qui comme moi étaient coincés 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. J'espère que cela vous aidera.

youkoal
la source