Змініть сторінки Таксономія, щоб виключити елементи в дитячих таксономіях


18

Я знайшов це питання:

Є спосіб використовувати $ query-> set ('tax_query' у фільтрі pre_get_posts?

що, схоже, вказує на те, що так, ви можете змінити запит таксономії в архівах таксономії за допомогою pre_get_posts (). тому я придумав

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

так само, як

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

спробувати встановити параметр include_children на false ... і майже про кожну комбінацію двох, про які я можу придумати. поки що, в архіві таксономії все ще відображаються пункти в дочірньому терміні

а наступний тест, здається, додає додаткові податкові запити замість їх перезапису ... що мене просто бентежить.

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

не повинен SET перезаписувати поточне значення?


Будь ласка, погляньте на цю відповідь . Це має принести вам далі.
кайзер

дякую, але це майже все, що я спробував. var_dumps / print_rs глобального $ wp_query показують, що новий податковий запит на додаток до існуючого запиту замість того, щоб замість… принаймні на моїй сторінці таксономії.
helgatheviking

Так, цей код призначений для додавання до запиту.
кайзер

тож немає способу коригувати / переосмислювати наявний запит? б / с, що я хочу, це змінити параметр include_children
helgatheviking

Відповіді:


22

Я знаю, що це давнє запитання, але це трохи заплутано і, сподіваюся, комусь допоможе. Причина того, що набір `$ query-> не працює, полягає в тому, що запит вже розібраний, і тепер нам також потрібно оновити об’єкт tax_query. Ось як я це зробив:

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

Солодкий !! Я перевірив це і зміг адаптувати ваш код так, щоб він працював для всіх таксономій, що було початковим питанням. +1 (я дав би вам більше грошей, якщо зможу)
helgatheviking

Я здивувався і переконався, що цей метод працює і для запитів на дату.
Девід

14

Станом на Wordpress 3.7, parse_tax_queryсаме для цієї мети було додано нову дію з назвою .

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

Цей гачок змінює значення як query_vars, так і tax_query. Використання pre_get_postsметоду призвело до дублювання запитів таксономії, принаймні для мене.

До 3.7 pre_get_postsзамість цього потрібно використовувати дію, як детально описано в інших відповідях.


У моєму випадку це здається занадто далекосяжним і має ненавмисні побічні ефекти ... це запобігає появі підменю моєї навігації.
Ману

2
@Manu - ти абсолютно прав. Наведений приклад дуже спрощений і показує лише відповідні змінні. У реальному сценарії ви б оглядали $wp_query, використовували теги шаблонів, або обидва, або якусь іншу логіку, щоб визначити, чи слід в першу чергу змінювати запит.
leepowers

5

Я не міг змусити це працювати з будь-якою комбінацією pre_get_postsабо parse_query. Я можу це зробити порівняно легко, витираючи об’єкт запиту після його створення. Мені це не подобається, бо тоді я двічі запускаю запит, але я закінчую свою кмітливість, намагаючись бути "ефективним".

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

Тож поки хтось не прийде разом з кращою відповіддю, це єдиний метод, який я знайшов поки що.

Редагувати:

Адаптуючи відповідь від @Tanner Moushey, я нарешті зміг зробити цю роботу, щоб виключити всі дочірні терміни з архіву таксономії на pre_get_postsгачку без неефективного подвійного запиту.

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

Це неправильно. Ви не повинні використовувати query_posts, використовувати pre_get_posts або запит замість цього.
ковшенін

це не корисно. чому б не опублікувати відповідь тоді, якщо ви знаєте, як зробити так, щоб pre_get_posts працював у цьому випадку? Я, очевидно, розмістив у своєму питанні, що я спробував це, але дійшов висновку, що ви не можете змінити об'єкт tax_Query через цей фільтр
helgatheviking

Вибачте, мав би бути кориснішим. Таким чином, реальний податковий запит будується (з parse_tax_query) після запуску pre_get_posts та фактичного WP_Tax_Query, який містить усі податкові запити, об’єднані зі змінними запиту (включаючи var_query query var), тому у вашому випадку він аналізує ваші пошукові запити tax_query, і потім додавання будь-якого іншого доступне за допомогою варіантів запитів, таких як категорія, tag__in та інші. Ви можете використовувати pre_get_posts для видалення існуючих варіантів запитів перед додаванням власного.
ковшенін

Дякую за краще пояснення. Очевидно, що це старе, тому я перейшов до рішення, яке мав. Я ніколи не зміг змінити include_childrenпараметр через pre_get_postsгачок. Ну добре.
helgatheviking

Так, я зрозумів, давно тут не бував;)
ковшенін

2

Для тих, хто, як я, застряг у цьому питанні, я знайшов щось корисне. Я використовував систему пріоритетів

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

Мій запит не був включений до результату, а пошук порушено із моїми виключеннями. Сподіваюсь, це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.