首页 > 解决方案 > 如何使用 WPQuery 获取有序结果

问题描述

我有一个events自定义帖子类型,我正在尝试订购它们,但我所做的似乎没有改变它们的顺序。我正在使用高级自定义字段,所以我将 设置为meta_key我关心的属性。

这个查询有什么问题吗?


function events_archive( $query ) {
  if( is_admin() ) {
    return $query;
  }

  if( $query->is_post_type_archive('events')  && $query->is_main_query()) {
    $query->set('meta_key', 'start_date');
    $query->set('orderby',  'meta_value');
    $query->set('order', 'ASC');
    $query->set('meta_query', array(
                                  array(
                                    'key' => 'start_date',
                                    'value' => date('Ymd'),
                                    'type' => 'DATE',
                                    'compare' => '>=',
                                    ) 
                                 )
    );
    return $query;
  }
}

我得到了结果,但我注意到我可以交换$query->set('order', 'ASC')并且$query->set('order', 'DESC');它不会改变顺序。

我看过一些类似的 SO 帖子,建议使用$query->set('orderby', 'meta_value_num');而不是,$query->set('orderby', 'meta_value');但这似乎对排序没有任何影响。

关于如何让订购按预期工作的任何建议?

标签: phpwordpressadvanced-custom-fields

解决方案


您可以尝试使用元值作为日期以及设置元类型。当您进行实际的元查询时,您指定了查询帖子的日期,但您并没有告诉查询必须按日期对它们进行排序。

function events_archive( $query ) {
  if( is_admin() ) {
    return $query;
  }

  if( $query->is_post_type_archive('events')  && $query->is_main_query()) {
    $query->set('meta_key', 'start_date');
    $query->set('meta_type', 'DATE');
    $query->set('orderby',  'meta_value_date');
    $query->set('order', 'ASC');
    $query->set('meta_query', array(
                                  array(
                                    'key' => 'start_date',
                                    'value' => date('Ymd'),
                                    'type' => 'DATE',
                                    'compare' => '>=',
                                    ) 
                                 )
    );
    return $query;
  }
}

推荐阅读