Modificare le pagine di tassonomia per escludere elementi nelle tassonomie figlie

22 feb 2012, 22:04:36
Visualizzazioni: 15.3K
Voti: 19

Ho trovato questa domanda:

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

che sembra indicare che sì, puoi modificare la query di tassonomia negli archivi di tassonomia via pre_get_posts(). Quindi ho creato:

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 è venuta in mente. Finora però, l'archivio di tassonomia mostra ancora gli elementi nel termine figlio.

E il seguente test sembra solo AGGIUNGERE le query di tassonomia 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');

Non dovrebbe SET sovrascrivere il valore corrente?

4
Commenti

Per favore dai un'occhiata a questa risposta. Dovrebbe aiutarti a procedere.

kaiser kaiser
23 feb 2012 09:00:01

grazie, ma è più o meno quello che ho provato. var_dumps/print_rs della variabile globale $wp_query mostrano che la nuova tax query viene aggiunta alla query esistente invece di sostituirla... almeno nella mia pagina di tassonomia.

helgatheviking helgatheviking
23 feb 2012 17:52:15

Sì, quel codice è pensato per aggiungere alla query.

kaiser kaiser
23 feb 2012 18:05:00

quindi non c'è modo di modificare/sovrascrivere la query esistente? perché quello che voglio è cambiare il parametro include_children

helgatheviking helgatheviking
23 feb 2012 18:11:45
Tutte le risposte alla domanda 5
3
27

So che questa è una domanda vecchia, ma è un po' confusa e spero possa aiutare qualcuno. Il motivo per cui `$query->set` non funziona è perché la query è già stata analizzata e ora dobbiamo aggiornare anche l'oggetto tax_query. Ecco come 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' );
3 mag 2013 02:15:28
Commenti

Fantastico!! Ho controllato e sono riuscito ad adattare il tuo codice per farlo funzionare con tutte le tassonomie, che era la domanda originale. +1 (ti darei più upvote se potessi)

helgatheviking helgatheviking
3 mag 2013 06:07:08

Sono rimasto sorpreso e rassicurato nel vedere che questo metodo funziona anche per le query di data.

David David
9 set 2014 21:13:29

mmm - questo non funziona per me. Funziona nella query principale e/o in is_search?

v3nt v3nt
3 lug 2020 12:29:47
2
17

A partire da WordPress 3.7 è stata aggiunta una nuova azione chiamata parse_tax_query 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 sia di query_vars che di tax_query. Utilizzando il metodo pre_get_posts si ottenevano query tassonomiche duplicate, almeno nel mio caso.

Prima della versione 3.7 bisogna utilizzare l'azione pre_get_posts invece, come dettagliato nelle altre risposte.

10 apr 2014 23:32:43
Commenti

Nel mio caso, sembra un po' troppo invasivo e ha effetti collaterali indesiderati... impedisce la visualizzazione dei sottomenu della mia navigazione.

Manu Manu
29 mag 2015 23:14:51

@Manu - hai perfettamente ragione. L'esempio fornito è molto semplificato e mostra solo le variabili rilevanti. In uno scenario reale dovresti analizzare $wp_query, utilizzare i template tag, o entrambi, o qualche altra logica, per determinare se la query debba essere modificata in primo luogo.

leepowers leepowers
29 mag 2015 23:21:32
6

Non sono riuscito a farlo funzionare con nessuna combinazione di pre_get_posts o parse_query. Posso farlo relativamente facilmente azzerando l'oggetto query dopo che è stato creato. Non mi piace perché così eseguo la query due volte, ma sono arrivato al limite nel cercare 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 // Escludi i termini figli
                )
            )
        );
        query_posts($args); 
    }
}

add_action('wp','kia_no_child_taxonomies');

Quindi, finché qualcuno non proporrà una soluzione migliore, questo è l'unico metodo che ho trovato finora.

MODIFICA:

Adattando la risposta di @Tanner Moushey, sono finalmente riuscito a far funzionare questo codice per escludere tutti i termini figli da un archivio tassonomico usando l'hook pre_get_posts senza la doppia query inefficiente.

function kia_no_child_taxonomies( $query ) {

    if( is_tax() ):

    $tax_obj = $query->get_queried_object();

   $tax_query = array(
                    'taxonomy' => $tax_obj->taxonomy, // Ottieni la tassonomia corrente
                    'field' => 'slug',
                    'terms' => $tax_obj->slug, // Ottieni lo slug del termine corrente
                    'include_children' => false // Escludi i termini figli
            );
   $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' );
24 feb 2012 03:11:13
Commenti

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

kovshenin kovshenin
9 ago 2012 03:21:47

non è utile. perché non posti una risposta allora se sai come far funzionare pre_get_posts in questo caso? ho ovviamente specificato nella mia domanda che ho provato, ma sono giunto alla conclusione che non puoi modificare l'oggetto tax_Query attraverso quel filtro

helgatheviking helgatheviking
10 ago 2012 15:11:13

Scusa, avrei dovuto essere più utile. Quindi la vera tax query viene costruita (con parse_tax_query) dopo che pre_get_posts viene attivato, e in un WP_Tax_Query effettivo, che contiene tutte le tax query combinate dalle variabili di query (inclusa la query var tax_query) quindi nel tuo caso sta analizzando la tua query var tax_query, e poi aggiungendo tutto ciò che è disponibile tramite le query var, come category, tag__in e altre. Puoi usare pre_get_posts per rimuovere le query var esistenti prima di aggiungere le tue.

kovshenin kovshenin
10 ott 2012 12:15:03

Grazie per la spiegazione più chiara. Ovviamente è un po' vecchio, quindi ho proseguito con la soluzione che avevo. Non sono mai riuscito a modificare il parametro include_children tramite l'hook pre_get_posts. Pazienza.

helgatheviking helgatheviking
10 ott 2012 16:16:32

Sì immaginavo, non frequento qui da molto tempo ;)

kovshenin kovshenin
10 ott 2012 17:09:03

Sembra che io sia bloccato anche con questo problema. :-/

its_me its_me
11 mar 2013 06:58:54
Mostra i restanti 1 commenti
0

Per coloro che, come me, erano bloccati con questo problema, ho trovato qualcosa di utile. Ho utilizzato il sistema di 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 );

La mia query non era inclusa nei risultati e la ricerca era interrotta a causa delle mie esclusioni. Spero che questo possa essere d'aiuto.

6 mag 2017 15:52:12
0

Mi sono imbattuto nel seguente thread su WP Core e lo sto usando con successo per escludere i figli di una specifica tassonomia:

function wpse_43181_parse_tax_query( $query ) {
  if ( ! empty( $query->tax_query->queries ) ) {
    foreach ( $query->tax_query->queries as &$tax_query ) {
      if ( $tax_query['taxonomy'] === 'your_taxonomy' ) {
        $tax_query['include_children'] = false;
      }
    }
  }
}
add_action( 'parse_tax_query', 'wpse_43181_parse_tax_query' );

Modificalo a tuo piacimento per escludere i figli da tutte le pagine di tassonomia.

23 gen 2020 09:02:37