Cum să modifici paginile de taxonomii pentru a exclude elementele din taxonomiile copil
Am găsit această întrebare:
Există o modalitate de a folosi $query->set('tax_query' în filtrul pre_get_posts?
care pare să indice că da, poți modifica interogarea de taxonomie pe arhivele de taxonomii prin pre_get_posts(). Așa că am venit cu:
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;
}
}
precum și
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 );
}
}
pentru a încerca să setezi parametrul include_children la false... și cam orice combinație dintre cele două mi-a venit în minte. Până acum însă, arhiva de taxonomie afișează în continuare elementele din termenii copil.
Iar următorul test pare doar să ADĂUGE interogări suplimentare de taxonomii în loc să le înlocuiască... ceea ce mă face să mă încurc.
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');
Nu ar trebui ca SET să înlocuiască valoarea curentă?

Știu că aceasta este o întrebare veche, dar este puțin confuză și sper să ajute pe cineva. Motivul pentru care `$query->set` nu funcționează este deoarece interogarea a fost deja analizată și acum trebuie să actualizăm și obiectul tax_query. Iată cum am făcut eu:
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' );

Super!! Am verificat asta și am reușit să adaptez codul tău să funcționeze pentru toate taxonomiile, care era întrebarea inițială. +1 (ți-aș da mai multe voturi dacă aș putea)

Am fost surprins și liniștit să văd că această metodă funcționează și pentru interogările după dată.

Începând cu WordPress 3.7, a fost adăugată o nouă acțiune numită parse_tax_query
exact pentru acest scop.
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');
Acest hook modifică valorile atât ale query_vars, cât și ale tax_query. Folosirea metodei pre_get_posts
a dus la duplicate în interogările de taxonomie, cel puțin în cazul meu.
Înainte de versiunea 3.7, trebuie să utilizați acțiunea pre_get_posts
, așa cum este detaliat în celelalte răspunsuri.

În cazul meu, acest lucru pare puțin prea amplu și are efecte secundare neintenționate... împiedică afișarea submeniurilor din navigația mea.

@Manu - ai perfectă dreptate. Exemplul oferit este foarte simplificat și arată doar variabilele relevante. Într-un scenariu real, ai inspecta $wp_query
, ai folosi template tags, sau ambele, sau altă logică, pentru a determina dacă interogarea ar trebui modificată în primul rând.

Nu am reușit să fac asta să funcționeze cu nicio combinație de pre_get_posts
sau parse_query
. Pot să o fac relativ ușor prin ștergerea obiectului de interogare după ce este creat. Nu-mi place pentru că atunci rulez interogarea de două ori, dar am epuizat toate ideile în încercarea de a fi "eficient".
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');
Deci, până când vine cineva cu un răspuns mai bun, aceasta este singura metodă pe care am găsit-o până acum.
EDIT:
Adaptând răspunsul de la @Tanner Moushey, am reușit în sfârșit să fac asta să funcționeze pentru a exclude toți termenii copii dintr-o arhivă de taxonomie pe hook-ul pre_get_posts
fără ineficienta dublă interogare.
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' );

Aceasta este greșit. Nu ar trebui să folosești query_posts, folosește pre_get_posts sau request în loc.

asta nu este de ajutor. de ce nu postezi un răspuns atunci dacă știi cum să faci pre_get_posts să funcționeze în acest caz? evident am menționat în întrebarea mea că am încercat, dar am ajuns la concluzia că nu poți modifica obiectul tax_Query prin acel filtru

Scuze, ar fi trebuit să fiu mai de ajutor. Deci adevărata interogare tax (cu parse_tax_query) este construită după ce pre_get_posts este declanșat, și într-un WP_Tax_Query real, care conține toate interogările tax combinate din variabilele de interogare (inclusiv variabila tax_query) deci în cazul tău se parsează variabila tax_query, și apoi se adaugă orice altceva este disponibil prin variabilele de interogare, cum ar fi category, tag__in și altele. Poți folosi pre_get_posts pentru a elimina variabilele de interogare existente înainte de a adăuga propriile tale.

Mulțumesc pentru explicația mai bună. Evident, acest lucru este vechi, așa că am continuat cu soluția pe care o aveam. Nu am reușit niciodată să modific parametrul include_children
prin hook-ul pre_get_posts
. Oh well.

Se pare că sunt blocat și eu cu această problemă. :-/

Pentru cei care, ca și mine, s-au blocat cu această problemă, am găsit ceva util. Am folosit sistemul de priorități.
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 );
Interogarea mea nu era inclusă în rezultate, iar căutarea era defectă din cauza excluderilor mele. Sper că acest lucru vă va fi de ajutor.

Am dat peste următorul fir de discuție pe WP Core și îl folosesc cu succes pentru a exclude termenii copii pentru o taxonomie specifică:
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' );
Modifică-l după nevoile tale pentru a exclude termenii copii de pe toate paginile de taxonomii.
