问题描述
使用以下代码 (在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。