問題描述
我發現這個問題:
Theres a way to use $query->set(‘tax_query’ in 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');
不應該設定覆蓋當前值嗎?
最佳解決方案
我知道這是一個老問題,但有點混亂,希望能幫助某人。 `$ 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 然後我執行查詢兩次,但我在我的機智的最後,試圖成為’efficient’
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 掛鉤中的分類歸檔中排除所有的子條款,而沒有效率低下的 double-query 。
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' );
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。