问题描述

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