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


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.