Изменить страницы таксономии, чтобы исключить элементы в дочерних таксономиях

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 перезаписывать текущее значение?

helgatheviking
источник
Пожалуйста, посмотрите на этот ответ . Это должно привести вас дальше.
Кайзер
спасибо, но это почти то, что я пробовал. var_dumps / print_rs глобального $ wp_query показывает, что новый налоговый запрос в дополнение к существующему запросу вместо ... по крайней мере на моей странице таксономии.
helgatheviking
Да, этот код предназначен для добавления к запросу.
Кайзер
так нет способа настроить / переопределить существующий запрос? б / с, что я хочу, это изменить параметр include_children
helgatheviking

Ответы:

22

Я знаю, что это старый вопрос, но он немного сбивает с толку и, надеюсь, поможет кому-то. Причина того, что `$ query-> set не работает, заключается в том, что запрос уже был проанализирован, и теперь нам нужно также обновить объект 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действие вместо этого, как подробно описано в других ответах.

leepowers
источник
В моем случае, это кажется слишком далеко идущим и имеет непреднамеренные побочные эффекты ... это предотвращает появление подменю моей навигации.
Ману
2
@ Ману - ты полностью прав. Приведенный пример очень упрощен и показывает только соответствующие переменные. В реальном сценарии вы должны проверить $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' );
helgatheviking
источник
Это не правильно. Вы не должны использовать query_posts, использовать pre_get_posts или request.
Ковшенин
это не полезно почему бы не опубликовать ответ, если вы знаете, как заставить pre_get_posts работать в этом случае? Я очевидно написал в своем вопросе, что я попробовал это, но пришел к выводу, что вы не можете изменить объект tax_Query через этот фильтр
helgatheviking
Извините, должен был быть более полезным. Таким образом, реальный налоговый запрос создается (с parse_tax_query) после запуска pre_get_posts, и в фактическом WP_Tax_Query, который содержит все налоговые запросы, объединенные из переменных запроса (включая var запроса tax_query), поэтому в вашем случае это парсинг вашего запроса tax_query var, и затем добавьте все, что доступно через переменные запроса, такие как category, 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 );

Мой запрос не был включен в результат, и поиск был прерван с моими исключениями. Надеюсь, это поможет.

youkoal
источник