使用meta_query,如何按自定义字段过滤并按另一字段排序?


10

使用以下代码(在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;
}

Answers:


15

这似乎是Wordpress中的错误。如果您将orderby和meta_key指定为查询变量,则Wordpress实际上会修改meta_query。通常,此修改会将新的meta_key添加为meta_query数组中的第一个数组,因此将orderby应用于meta_query中指定的第一个meta键。

但是,当您在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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.