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.