web-dev-qa-db-ja.com

Compareが日付の場合はmeta_keyを含むGet_post()

これは ここにある質問 に似ていますが、より具体的です。その質問はWordpress WP_Query example を示唆しています。

私のコードは次のとおりです。

    $posts = get_posts(array(
        'post_type'         => 'events',
        'posts_per_page'    => -1,
        'meta_key'          => 'from_datetime',
        'meta_value'        => date( "F d, Y g:i a" ), 
        'meta_compare'      => '>',
        'orderby'           => 'meta_value',
        'order'             => 'ASC'
    ));

カスタムフィールドは私たちのブログではACFを使って作られています。 from_datetimeフィールドは次のようになります。

April 18, 2017 2:30 pm

それで私はこれを日付命名法に翻訳しました:

date( "F d, Y g:i a" )

イベントはカスタム投稿タイプです。基本的に私は合格していない今後の2つのイベントを表示したいです。そのため、これはWP_Queryページの例に非常に近くなりますが、それでも上記のものは機能しません。クエリは何も返しません。上記のmeta_valueを削除すると、「今」を超えていることを示す4つのイベントがあることを私は知っています。

私が間違ってしている可能性があることについて何か考えはありますか? WPのドキュメントによると、クエリは正しいようです。ありがとうございました!

3
PKHunter

クエリに誤りがあると思います。これを試してください。

$posts = get_posts(array(
    'post_type'         => 'events',
    'posts_per_page'    => -1,
    'meta_query'        => array(
        'meta_key'          => 'from_datetime',
        'type'              => 'DATETIME',  // You can also try changing it to TIME or DATE if it doesn't work
        'meta_value'        => date( "F d, Y g:i a" ),
        'meta_compare'      => '>',
    ),
    'orderby'           => 'meta_value',
    'order'             => 'ASC'
));
2
Abdul Awal

ACF Proを使用していますか(たとえば、 "Date and Time Picker"フィールドタイプを使用していますか)。または、日付/時刻フィールドタイプを "normal" ACFに追加するプラグインのいずれか(例:Advanced Customの Date&Time Picker)フィールド ).

前者の場合、フィールド定義で指定されている「表示形式」または「戻り形式」に関係なく、日付/時刻値は$wpdb->postmetaのように2017-04-18 14:30:00に格納されます。したがって、次のようにクエリする必要があります。

$posts = get_posts(array(
    'post_type'         => 'events',
    'posts_per_page'    => -1,
    'meta_key'          => 'from_datetime',
    'meta_value'        => date( "Y-m-d h:i:s" ), 
    'meta_compare'      => '>',
    'orderby'           => 'meta_value',
    'order'             => 'ASC'
));

日付/時刻型のフィールドを "通常の" ACFに追加するプラグインのいずれかを使用している場合は、そのプラグインが値を格納し、それに応じてmeta_valueをフォーマットする方法を理解する必要があります。