web-dev-qa-db-ja.com

WordPressのmeta_queryとカスタムフィールドによる並べ替え

私は " Films "というカスタム投稿タイプを持ち、 " Showings "というRepeaterフィールドはDateTime型のフィールド " start_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日間に上映されているすべての映画を正しく取得しますが、その後、最初の上映のstart_datetimeの順に並べますFIRST FUTURE表示中のstart_datetime順に並べ替えてください。


例:
映画Aは今日上映されています。
映画Bは明日、もう1年前に上映されます。

私の結果は次のとおりです。フィルムB、次にフィルムA(実際にはフィルムBが上映開始の延期を伴うものであるため)。しかし、映画Aは最初の未来を映し出した映画だからです。..

3
MikO

WP_Queryによって作成された実際のSQLを調べることによって問題を発見しました。生成されたSQLクエリには2つの内部結合があり、1つはmeta_key用で、もう1つは実際のmeta_query用です。

基本的には、次の7日間にshowings_%_start_datetimeを持つフィルムをフィルタリングすることと、他方で(独立して)フィルムをshowings_%_start_datetime値で順序付けることです。

meta_queryパラメータを baseクエリ に移動するだけで正常に動作します。

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',
));
1
MikO