Modificare le pagine di tassonomia per escludere elementi nelle tassonomie figlie
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?

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

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)

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

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.

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

@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.

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

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

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

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.

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.

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

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.

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.
