web-dev-qa-db-ja.com

開始日順に並べられた現在および将来のイベントを照会します。

カスタム投稿タイプのUI拡張機能を使用して、 'date-debut'や 'date-fin'などのカスタムフィールド(拡張拡張カスタムフィールドで作成)を使用して入力される 'イベント'カスタム投稿タイプを作成しました。 。

この投稿タイプ専用のアーカイブページで、次の10件(現在または将来)のイベントを開始日順に表示します。

ソート部分はそれ自体で問題ないようです。しかし、日付にテストを追加しても動作しなくなり、とにかく動作しなくなります。

これが私のコードです:

        $current_date = date('ymd');
        $my_query = new WP_Query( array ( 
        'post_type'         => 'mna_event',
        'posts_per_page'    => 10,
        'orderby'           => 'meta_value_num',
        'meta_key'          => 'date_debut',
        'order'             => 'ASC',
        'meta_query'        => array (
            'relation'      => 'OR',
            array (
                'key'       => 'date_debut',
                'value'     => $current_date,
                'compare'   => '>='
                ),
            array (
                'key'       => 'date_fin',
                'value'     => $current_date,
                'compare'   => '>='
                )
            )
        )
    );

問題についてのアドバイスは大歓迎です。ありがとう

2
tosca

これはmeta_query上のORリレーションとWordPressが実際のクエリ文字列を生成する方法が原因で起こります。クエリの引数からmeta_keyorderbyを除外し、クエリのwhereorderbyの部分を変更するためにposts_clausesフィルタにフックする必要があります。

function wpse_130954_orderby_fix($pieces){
    global $wpdb;
    $pieces['where']  .= " AND $wpdb->postmeta.meta_key = 'date_debut'";
    $pieces['orderby']  = "$wpdb->postmeta.meta_value ASC";
    return $pieces;
}

WP_Queryオブジェクトを設定する前にフィルタを追加し、他のクエリに影響を与えないように、クエリの実行後に必ずフィルタを削除してください。

add_filter( 'posts_clauses', 'wpse_130954_orderby_fix', 20, 1 );
$current_date = date_i18n('Y-m-d');
$my_query = new WP_Query( array ( 
    'post_type'         => 'mna_event',
    'posts_per_page'    => 10,
    'meta_query'        => array (
        'relation'      => 'OR',
        array(
            'key'       => 'date_debut',
            'value'     => $current_date,
            'compare'   => '>=',
            'type'      => 'DATE'
            ),
        array(
            'key'       => 'date_fin',
            'value'     => $current_date,
            'compare'   => '>=',
            'type'   => 'DATE'
            )
        )
    )
);

$result = $my_query->posts;

remove_filter( 'posts_clauses', 'wpse_130954_orderby_fix', 20 );

UPDATE: / ACF設定の日付フィールドにyy-mm-ddフォーマットを使う。 (JS/ACFのyy-mm-dd = PHP/MySQLの日付/時刻形式のY-m-d)この形式用に上記のコードを更新しました。 ($current_dateフォーマットを更新し、'type' => 'DATE'meta_queryを追加)

3
Parham