web-dev-qa-db-ja.com

Meta_queryで日付を比較できない

これは、日付メタデータが今日より新しいイベント投稿を取得するために使用するコードです。

    <?php
        query_posts( array(
        'post_type' => 'concerts',
        'meta_key' => 'numericdate',
        'posts_per_page' => -1,
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'meta_query' => array(
            array(
                'key' => 'numericdate',
                'value' => date('dmY'),
                'compare' => '>=',
                'type' => 'date'
                 )
           )
    ) );
    if (have_posts()) : ?>

結果は返されませんでした。 "numericdate"フィールドには "ddmmyyyy"という文字列が含まれているので、 "dmY"の今日の日付値と比較してもうまくいくことが期待できます。私は間違っていた。または上記のコードに誤りがあります。ご協力いただきありがとうございます !

7
Pierre

私は標準偏差を使用することを除いて、私はここでまったく同じ問題を抱えています。クエリの投稿タイプ(投稿)とカテゴリ。ソート順以外はすべてうまくいきます。

$d = date("Y-m-d");
$args = array(
    'post_type'         => 'post',
    'category_name'     => 'events',
    'post_status'       => 'publish,draft,pending,future,private', // just for me
    'meta_key'          => 'event_start',
    'orderby'           => 'meta_value_num',
    'order'             => 'ASC',
    'posts_per_page'    => -1,
    'meta_query'        => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);

それでも、私の投稿は文字列比較でソートされます。私はどうしたの?

ちょっとした試行錯誤の後、私は 'meta_value_num'の代わりに 'meta_value'を使うべきだったことを知りました:

$d = date("Y-m-d");
$args = array(
    'post_type'             => 'post',
    'category_name'     => 'events',
    'post_status'           => 'publish,draft,pending,future,private',
    'meta_key'              => 'event_start',
    'orderby'               => 'meta_value',
    'order'                     => 'ASC',
    'posts_per_page'        => -1,
    'meta_query'            => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);
6
micha

その価値のために、この種の問い合わせにはwordpress current_time() を使用してください。

current_time('mysql')は、MySQLが許容できる管理者設定に従ってサーバー時間を提供します。

MySQLの日付フォーマットはYYYY-MM-DDであるべきだと思います。またorderbyはmeta_value_numであるべきだと思います、そうでなければ値は文字列として扱われます。

3
Milo

誰かが同じ問題を抱えているなら、 posts_clauses filterを見たほうがいいでしょう。
クエリSQLそのものを操作することができます。
そこで、日付列の値を変換したり、where句とorderby句を変更したりできます。

$pieces['where'] .= " AND STR_TO_DATE(wp_postmeta.meta_value,'%d%m%Y' ) >= 
  CURRENT_DATE() ";

$pieces['orderby'] = "STR_TO_DATE( wp_postmeta.meta_value,'%d%m%Y' ) DESC";
0
Yaron

MySQLの日付フォーマットの設定はさておき、Y-m-dのようなbigendianフォーマットを使う多くの正当な理由があります。

あなたは日付を比較することは明らかだろうと思うでしょうが….

05262011> 01012012

等々。あなたはdmYフォーマットを使用しようとするとあなた自身に多くの問題を引き起こすでしょう。

また、 'date'がmeta_query "type"に受け入れられるパラメータの1つであるとは思いません。最良の結果を得るには、そのパラメータを省略し、文字列比較を使用してください。

0
goldenapples