Cum să modifici paginile de taxonomii pentru a exclude elementele din taxonomiile copil

22 feb. 2012, 22:04:36
Vizualizări: 15.3K
Voturi: 19

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ă?

4
Comentarii

Te rog să arunci o privire la acest răspuns. Ar trebui să te ajute mai departe.

kaiser kaiser
23 feb. 2012 09:00:01

mersi, dar asta e cam ce am încercat deja. var_dumps/print_rs ale globalei $wp_query arată că noul tax_query se adaugă la interogarea existentă în loc să o înlocuiască... cel puțin pe pagina mea de taxonomie.

helgatheviking helgatheviking
23 feb. 2012 17:52:15

Da, acel cod este menit să adauge la interogare.

kaiser kaiser
23 feb. 2012 18:05:00

deci nu există nicio modalitate de a ajustați/înlocui interogarea existentă? pentru că ceea ce vreau este să schimb parametrul include_children

helgatheviking helgatheviking
23 feb. 2012 18:11:45
Toate răspunsurile la întrebare 5
3
27

Ș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' );
3 mai 2013 02:15:28
Comentarii

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)

helgatheviking helgatheviking
3 mai 2013 06:07:08

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

David David
9 sept. 2014 21:13:29

hmm - la mine nu funcționează. Funcționează în interogarea principală și/sau în is_search?

v3nt v3nt
3 iul. 2020 12:29:47
2
17

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

10 apr. 2014 23:32:43
Comentarii

Î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 Manu
29 mai 2015 23:14:51

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

leepowers leepowers
29 mai 2015 23:21:32
6

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' );
24 feb. 2012 03:11:13
Comentarii

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

kovshenin kovshenin
9 aug. 2012 03:21:47

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

helgatheviking helgatheviking
10 aug. 2012 15:11:13

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.

kovshenin kovshenin
10 oct. 2012 12:15:03

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.

helgatheviking helgatheviking
10 oct. 2012 16:16:32

Da, mi-am dat seama, n-am mai fost aici de mult timp ;)

kovshenin kovshenin
10 oct. 2012 17:09:03

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

its_me its_me
11 mar. 2013 06:58:54
Arată celelalte 1 comentarii
0

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.

6 mai 2017 15:52:12
0

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.

23 ian. 2020 09:02:37