2014-03-27 63 views
1

我有一个自定义文章类型称为“电影”,具有中继场名为“下片”,其中有一个字段“start_datetime” DateTime类型...WordPress的meta_query和排序依据的自定义字段

我想在未来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的电影,我需要它通过的第一个未来的start_datetime来订购它们......请帮忙吗?


实施例:
膜A今天的展示。
电影B有一个明天和另一个显示1年前。

我的结果将被命令:电影B,然后电影A(因为实际上电影B是一个显示开始eralier)。但我需要以相反的顺序排列,因为电影A是第一部未来电影...

回答

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', 
)); 
相关问题