Modifica le pagine di tassonomia per escludere elementi nelle tassonomie secondarie


18

Ho trovato questa domanda:

C'è un modo per usare $ query-> set ('tax_query' nel filtro pre_get_posts?

che sembra indicare che sì, è possibile modificare la query di tassonomia sugli archivi di tassonomia tramite pre_get_posts (). così ho pensato

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

così come

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

per provare a impostare il parametro include_children su false ... e praticamente ogni combinazione delle due che mi viene in mente. finora, tuttavia, l'archivio tassonomia mostra ancora gli elementi nel termine secondario

e il seguente test sembra semplicemente AGGIUNGERE le domande fiscali aggiuntive invece di sovrascriverle ... il che mi confonde.

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 non dovrebbe sovrascrivere il valore corrente?


Dai un'occhiata a questa risposta . Questo dovrebbe portarti oltre.
— Kaiser

grazie, ma è praticamente quello che ho provato. var_dumps / print_rs del $ wp_query globale stanno mostrando quella nuova query fiscale oltre alla query esistente anziché al posto di ... almeno sulla mia pagina di tassonomia.
— Helgatheviking,

Sì, quel codice dovrebbe essere aggiunto alla query.
— Kaiser

quindi non c'è modo di regolare / sovrascrivere la query esistente? b / c quello che voglio è cambiare il parametro include_children
— helgatheviking

Risposte:


22

So che questa è una vecchia domanda, ma è un po 'confusa e spero possa aiutare qualcuno. La ragione per cui `$ query-> set non funziona è perché la query è già stata analizzata e ora dobbiamo anche aggiornare anche l'oggetto tax_query. Ecco come l'ho fatto:

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

Dolce!! Ho controllato questo e sono stato in grado di adattare il tuo codice affinché funzioni per tutte le tassonomie, che era la domanda originale. +1 (ti darei più voti se potessi)
— helgatheviking

Sono stato sorpreso e rassicurato nel vedere che questo metodo funziona anche per le query sulla data.
— David,

14

A partire da Wordpress 3.7 è parse_tax_querystata aggiunta una nuova azione denominata proprio per questo scopo.

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

Questo hook modifica i valori di query_vars e tax_query. L'uso del pre_get_postsmetodo ha portato a query tassonomiche duplicate, almeno per me.

Prima della 3.7 devi invece usare l' pre_get_postsazione, come descritto nelle altre risposte.


Nel mio caso, questo sembra un po 'troppo esteso e ha effetti collaterali non intenzionali ... impedisce la visualizzazione dei sottomenu della mia navigazione.
— Manu,

2
@Manu - hai completamente ragione. L'esempio fornito è molto semplificato e mostra solo le variabili rilevanti. In uno scenario di vita reale ispezioneresti $wp_query, utilizzeresti tag modello, o entrambi, o qualche altra logica, per determinare se la query deve essere modificata in primo luogo.
— Leepowers,

5

Non sono riuscito a farlo funzionare con nessuna combinazione di pre_get_postso parse_query. Posso farlo relativamente facilmente cancellando l'oggetto query dopo che è stato creato. Non mi piace perché poi eseguo la query due volte, ma sono alla fine del mio ingegno cercando di essere "efficiente".

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

Quindi, finché qualcuno non arriva con una risposta migliore, questo è l'unico metodo che ho trovato finora.

MODIFICARE:

Adattando la risposta di @Tanner Moushey, sono stato finalmente in grado di far funzionare questo lavoro per escludere tutti i termini figlio da un archivio di tassonomia all'hook pre_get_postssenza l'inefficiente doppia query.

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

Questo è sbagliato. Non dovresti usare query_posts, usare pre_get_posts o request invece.
— kovshenin,

non è utile. perché non pubblicare una risposta, se sai come far funzionare pre_get_posts in questa istanza? ho ovviamente pubblicato nella mia domanda che l'ho provato, ma sono giunto alla conclusione che non è possibile modificare l'oggetto tax_Query attraverso quel filtro
— helgatheviking

Spiacente, avrebbe dovuto essere più utile. Quindi la query fiscale reale viene creata (con parse_tax_query) dopo l'attivazione di pre_get_posts e in un WP_Tax_Query reale, che contiene tutte le query fiscali combinate da variabili di query (inclusa la query var tax_query), quindi nel tuo caso analizza la tua query var tax_query e quindi aggiungendo tutto ciò che è disponibile tramite query vars, come categoria, tag__in e altri. È possibile utilizzare pre_get_posts per rimuovere le query esistenti prima di aggiungere il proprio.
— kovshenin,

Grazie per la migliore spiegazione Ovviamente questo è vecchio, quindi sono passato alla soluzione che avevo. Non sono mai stato in grado di modificare il include_childrenparametro tramite l' pre_get_postshook. Ah bene.
— Helgatheviking,

Sì, ho pensato, non sono qui da molto tempo;)
— kovshenin,

2

Per coloro che come me sono rimasti bloccati da questo problema, ho trovato qualcosa di utile. Ho usato il sistema prioritario

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

La mia query non è stata inclusa nel risultato e la ricerca è stata interrotta con le mie esclusioni. Spero che questo possa aiutare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.