Zmodyfikuj strony taksonomii, aby wykluczyć elementy w taksonomiach podrzędnych


18

Znalazłem to pytanie:

Jest sposób na użycie $ query-> set ('tax_query' w filtrze pre_get_posts?

co wydaje się wskazywać, że tak, można zmienić zapytanie dotyczące taksonomii w archiwach taksonomii za pomocą pre_get_posts (). więc wymyśliłem

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;
  }
}

jak również

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

aby spróbować ustawić parametr include_children na false ... i prawie każdą kombinację tych dwóch, o których mogę myśleć. jak dotąd jednak w archiwum taksonomii nadal są wyświetlane elementy z okresu potomnego

a następujący test wydaje się DODAWAĆ dodatkowe zapytania podatkowe zamiast nadpisywać je ... co mnie tylko myli.

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

czy SET nie powinien zastąpić bieżącej wartości?


Proszę spojrzeć na tę odpowiedź . To powinno doprowadzić cię dalej.
kaiser

dzięki, ale to prawie to, co próbowałem. var_dumps / print_rs z $ wp_query global pokazują, że nowe zapytanie podatkowe oprócz istniejącego zapytania zamiast zamiast ... przynajmniej na mojej stronie systematyki.
helgatheviking

Tak, ten kod jest przeznaczony do dodania do zapytania.
kaiser

więc nie ma sposobu na dostosowanie / zastąpienie istniejącego zapytania? b / c chcę zmienić parametr include_children
helgatheviking

Odpowiedzi:


22

Wiem, że to stare pytanie, ale jest trochę mylące i mam nadzieję, że komuś pomoże. Powodem, dla którego `$ query-> set nie działa, jest to, że zapytanie zostało już przeanalizowane i teraz musimy również zaktualizować również obiekt tax_query. Oto jak to zrobiłem:

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

Słodkie!! Sprawdziłem to i udało mi się dostosować kod do działania dla wszystkich systematyk, co było pierwotnym pytaniem. +1 (dałbym więcej głosów pozytywnych, gdybym mógł)
helgatheviking

Byłem zaskoczony i przekonany, że ta metoda działa również w przypadku zapytań o datę.
David

14

Począwszy od Wordpress 3.7, parse_tax_querywłaśnie w tym celu dodano nową akcję o nazwie .

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

Ten hak modyfikuje wartości zarówno kwerendy_podstawowej, jak i kwerendy podatkowej. Zastosowanie tej pre_get_postsmetody spowodowało zduplikowanie zapytań taksonomicznych, przynajmniej dla mnie.

Przed wersją 3.7 musisz użyć pre_get_postsakcji, jak opisano w innych odpowiedziach.


W moim przypadku wydaje się to zbyt daleko idące i ma niezamierzone skutki uboczne ... zapobiega wyświetlaniu podmenu mojej nawigacji.
Manu

2
@Manu - masz całkowitą rację. Podany przykład jest bardzo uproszczony i pokazuje tylko odpowiednie zmienne. W prawdziwym scenariuszu należy sprawdzić $wp_query, użyć tagów szablonów lub obu, lub innej logiki, aby ustalić, czy zapytanie powinno zostać zmodyfikowane w pierwszej kolejności.
leepowers

5

Nie mogłem tego uruchomić z żadną kombinacją pre_get_postslub parse_query. Mogę to zrobić stosunkowo łatwo, usuwając obiekt zapytania po jego utworzeniu. Nie podoba mi się to, ponieważ wtedy uruchamiam zapytanie dwa razy, ale dowiaduję się, że staram się być „wydajny”.

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

Więc dopóki ktoś nie przyjdzie z lepszą odpowiedzią, jest to jedyna metoda, jaką do tej pory znalazłem.

EDYTOWAĆ:

Dostosowując odpowiedź @Tanner Moushey, w końcu udało mi się to zrobić, aby wykluczyć wszystkie terminy potomne z archiwum systematyki na pre_get_postshaku bez niewydajnego podwójnego zapytania.

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

To jest źle. Nie powinieneś używać zapytań_początkowych, zamiast tego użyj pre_get_posts lub żądania.
kovshenin

to nie jest pomocne. dlaczego nie opublikować odpowiedzi, jeśli wiesz, jak sprawić, by pre_get_posts działały w tym przypadku? oczywiście napisałem w moim pytaniu, że próbowałem, ale doszedłem do wniosku, że nie można zmodyfikować obiektu tax_Query przez ten filtr
helgatheviking

Przepraszamy, powinien być bardziej pomocny. Tak więc prawdziwe zapytanie podatkowe jest budowane (z parse_tax_query) po uruchomieniu pre_get_posts oraz w faktycznym WP_Tax_Query, który zawiera wszystkie zapytania podatkowe połączone ze zmiennych zapytań (w tym var_query query_query var), więc w twoim przypadku parsuje zapytanie var_query query i następnie dołączając wszystko inne, co jest dostępne za pośrednictwem zmiennych zapytań, takich jak kategoria, tag__in i inne. Możesz użyć pre_get_posts, aby usunąć istniejące zmienne zapytania przed dodaniem własnych.
kovshenin,

Dzięki za lepsze wyjaśnienie. Oczywiście jest to stare, więc przeszedłem do rozwiązania, które miałem. Nigdy nie byłem w stanie zmodyfikować include_childrenparametru za pomocą pre_get_postshaka. Ach tak.
helgatheviking

Tak, pomyślałem, że nie byłem tu od dawna;)
kovshenin

2

Dla tych, którzy tak jak ja utknęli z tym problemem, znalazłem coś przydatnego. Użyłem systemu priorytetów

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

Moje zapytanie nie zostało uwzględnione w wyniku, a wyszukiwanie zostało zerwane z moimi wykluczeniami. Mam nadzieję, że to pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.