我有一个名为" 电影"的自定义帖子类型,其中包含一个名为" 显示"的中继器字段,其中有一个字段" start_datetime "类型DateTime ...
我想执行查询以在接下来的7天内让所有这些影片都显示,我想通过显示的start_datetime来订购它们。
我有这个问题:
$query = new \WP_Query( array(
'numberposts' => -1,
'post_type' => 'film',
'meta_key' => 'showings_%_start_datetime',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'showings_%_start_datetime',
'value' => array( time(), strtotime( '+7 days' ) ),
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
)
)
));
这会抓住所有在接下来的7天内正确展示的影片,但之后会按照 FIRST 的start_datetime来拍摄影片,我需要它是通过 FIRST FUTURE 的start_datetime来订购它们......请帮忙吗?
例:
电影A今天有一个展示
电影B有明天的展示,另一个展示在1年前。
我的结果将被订购:电影B,然后是电影A(因为实际上电影B是一个显示开始eralier的人)。但我需要反过来订购它,因为电影A是第一个展示未来的电影......
答案 0 :(得分:2)
我通过检查WP_Query
创建的实际SQL来发现问题。我意识到生成的SQL查询有2个INNER JOIN,一个用于meta_key
,另一个用于实际的meta_query
。
基本上,一方面它会过滤那些在接下来的七天内有showings_%_start_datetime
的电影,而另一方面(独立地)它会按照showings_%_start_datetime
值对电影进行排序。
将meta_query
参数移动到基本查询只需将其正常工作:
query = new \WP_Query( array(
'numberposts' => -1,
'post_type' => 'film',
'meta_key' => 'showings_%_start_datetime',
'meta_value' => array( time(), strtotime( '+7 days' ) ),
'meta_type' => 'NUMERIC',
'meta_compare' => 'BETWEEN',
'orderby' => 'meta_value_num',
'order' => 'ASC',
));