WordPress meta_query和orderby自定义字段

时间:2014-03-27 12:56:38

标签: wordpress advanced-custom-fields

我有一个名为" 电影"的自定义帖子类型,其中包含一个名为" 显示"的中继器字段,其中有一个字段" 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是第一个展示未来的电影......

1 个答案:

答案 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',
));