Измените страницы таксономии, чтобы исключить элементы из дочерних таксономий
Я нашел этот вопрос:
Есть способ использовать $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');
Не следует ли установить перезапись текущего значения?
5 answers
Я знаю, что это старый вопрос, но он немного сбивает с толку и, надеюсь, кому-то поможет. Причина, по которой `$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' );
Начиная с 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
. Я могу сделать это относительно легко, уничтожив объект запроса после его создания. Мне это не нравится, потому что тогда я выполняю запрос дважды, но я нахожусь в тупике, пытаясь быть "эффективным".
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 );
Мой запрос не был включен в результат, и поиск был прерван моими исключениями. Надеюсь, это поможет.
Я наткнулся на следующую тему в WP Core и успешно использую ее для исключения дочерних элементов для определенной таксономии:
function wpse_43181_parse_tax_query( $query ) {
if ( ! empty( $query->tax_query->queries ) ) {
foreach ( $query->tax_query->queries as &$tax_query ) {
if ( $tax_query['taxonomy'] === 'your_taxonomy' ) {
$tax_query['include_children'] = false;
}
}
}
}
add_action( 'parse_tax_query', 'wpse_43181_parse_tax_query' );
Настройте его по своему вкусу, чтобы исключить детей со всех страниц таксономии.