問題描述

我發現這個問題:

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。