問題描述

使用以下程式碼 (在 functions.php 中),我的帖子 (CPT 事件) 由_end_date 而不是_start_date 排序。對於 WP 3.1.3,這是什麼正確的解決方案?當然,我想避免使用不贊成使用的 meta_key

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
                                   array(
                                         'key' => '_end_date',
                                         'value' => time(),
                                         'compare' => '>=',
                                         'type' => 'numeric'
                                        )
                                   )
                              );
  }
  return $query;
}

最佳解決方案

這似乎是 Wordpress 中的一個錯誤。如果您將 orderby 和 meta_key 指定為查詢 vars,WordPress 實際上會修改 meta_query 。通常,此修改將新的 meta_key 新增為 meta_query 陣列中的第一個陣列,因此將 orderby 應用於 meta_query 中指定的第一個元鍵。

但是當您在 pre_get_posts 過濾器中修改 orderby,meta_key 和 meta_value query_vars 時,由於 Wordpress 中的 (似乎在我看來) 錯誤,它在現有的元查詢中新增了新的陣列,但新的陣列不會作為第一個陣列插入,它被附加到現有的 meta_query 。並且 orderby 總是應用於 meta_query 中的第一個 meta_key 。

所以作為一種解決方法,直到錯誤得到修復,您可以在 meta_query 中再次指定 meta_key 作為第一個陣列,如下例所示:

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
        array(
              'key' => '_start_date'
        ),
        array(
              'key' => '_end_date',
              'value' => time(),
              'compare' => '>=',
              'type' => 'numeric'
        )
  ));
  }
  return $query;
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。