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