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

Я нашел этот вопрос:

Есть способ использовать $ query-> set ('tax_query' в pre_get_posts filter?

что, похоже, указывает, что да, вы можете изменить таксономический запрос в архивах таксономии через 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?

Я знаю, что это старый вопрос, но он немного запутан и, надеюсь, поможет кому-то. Причина, по которой параметр `$ 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' ); 

Начиная с 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 , как описано в других ответах.

я не мог заставить это работать с любой комбинацией pre_get_posts или parse_query. я могу сделать это относительно легко, уничтожив объект запроса после его создания. мне не нравится b / c, тогда я выполняю запрос дважды, но я нахожусь в своем остроумие, пытаясь быть «эффективным»,

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

для тех, кто, как я, застрял в этом вопросе, я нашел что-то полезное. я использовал приоритетную систему

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

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