WP query_posts meta_queryの日付を比較する正しい方法は何ですか


32

WPテンプレートにquery_posts呼び出しがあります。More Fieldsプラグインを使用して、サイト管理者にイベント(カスタム投稿タイプ)を作成し、フォーマットされた日付YYYY / mm / ddを入力する機能を与えることができます。

主な質問は次のとおりです。meta_query配列のvalueオプションにどの値を渡す必要がありますか?私は現在、「date( "Y / m / dh:i A")」(引用符を除く)を渡そうとしています。これは、理解しているとおり、今日の日付を印刷するためです。日付の時刻は気にしないので、関係ないかもしれません。最終的には、比較オプションを使用して、このサイトのさまざまな場所での今後のイベント、過去のイベントを表示しようとしています。別の場所では、今月の最初の日と最後の日を出力する配列に値オプションを実際に渡す必要があり、出力は今月発生するイベントに制限されます。

<?php 
            query_posts( array( 
              'post_type'  => 'event',        // only query events
              'meta_key'    => 'event_date',  // load up the event_date meta
              'orderby'     => 'meta_value',  // sort by the event_date
              'order'       => 'asc',         // ascending, so earlier events first
              'posts_per_page' => '2',
              'meta_query'  => array(         // restrict posts based on meta values
                  'key'     => 'event_date',  // which meta to query
                  'value'   => date("Y/m/d h:i A"),  // value for comparison
                  'compare' => '>=',          // method of comparison
                  'type'    => 'DATE'         // datatype, we don't want to compare the string values
                ) // end meta_query array
              ) // end array
            ); // close query_posts call
                 ?>

回答:


44

私はまったく同じことに取り組んで、この投稿はとても役に立ちました。カスタムフィールドを使用しましたが、ここに、現在の日付よりも大きいすべてのイベントのリストを作成するために使用したコードを示します。追加の分類ベースのフィルターに注意してください。

<?php // Let's get the data we need to loop through below

$events = new WP_Query( 
    array(
        'post_type' => 'event', // Tell WordPress which post type we want
        'orderby' => 'meta_value', // We want to organize the events by date    
        'meta_key' => 'event-start-date', // Grab the "start date" field created via "More Fields" plugin (stored in YYYY-MM-DD format)
        'order' => 'ASC', // ASC is the other option    
        'posts_per_page' => '-1', // Let's show them all.   
        'meta_query' => array( // WordPress has all the results, now, return only the events after today's date
            array(
                'key' => 'event-start-date', // Check the start date field
                'value' => date("Y-m-d"), // Set today's date (note the similar format)
                'compare' => '>=', // Return the ones greater than today's date
                'type' => 'DATE' // Let WordPress know we're working with date
                )
            ),
        'tax_query' => array( // Return only concerts (event-types) and events where "songs-of-ascent" is performing
            array(
                'taxonomy' => 'event-types',
                'field' => 'slug',
                'terms' => 'concert',
                ),
            array(
                'taxonomy' => 'speakers',
                'field' => 'slug',
                'terms' => 'songs-of-ascent',
                )
            )
        )
    );
?>

5
どうして'type' => 'DATE'
フランシスココラレスモラレス

@FranciscoCorralesMoralesの疑問を確認できます。特に、日付メタフィールドは数値として保存されず、「Ymd」(ハイフンに注意してください)の形式で保存されるため、「DATE」タイプを指定する必要があります。ジョナサンの答えを編集しました。
マルコ・パニチ

国際化のためdate_i18n()に、php nativeの代わりにWordPress functionを使用したい場合がありますdate()
ジェイク

7

それは、そもそもメタ値に日付がどのように格納されているかに大きく依存します。一般的に、MySQLに日付をMySQLの日付/タイムスタンプとして保存することをお勧めします。

MySQLタイムスタンプの形式はですY-m-d h:i:s

ただし、WP独自の日付マングリング関数を使用することを常にお勧めします。そのため、MySQL形式で現在の日付を取得するには、を使用しますcurrent_time('mysql')

MySQLの日付を表示用にフォーマットするには、を使用しますmysql2date($format, $mysql_date)。この場合、設定で構成された日付を表示するのが最適なので、を使用します$format = get_option('date_format');

ユーザーが選択した日付を保存するには、それをMySQLの日付に変換する必要があります。そうするための最も簡単な方法は-しかし安全ではない-方法ですdate('Y-m-d h:i:s', $unix_timestamp);$unix_timestamp多くの場合、を介して導出できstrtotime($user_input)ます。

ただし、strtotime()独自の健全性チェックは行わないため、独自の会話関数を作成することをお勧めします。

月の範囲を取得するために、MySQLタイムスタンプの月の境界を取得するために使用している関数を次に示します。

function get_monthrange($time) {
    $ym = date("Y-m", strtotime($time));
    $start = $ym."-01";
    $ym = explode("-", $ym);
    if ($ym[1] == 12) {
        $ym[0]++; $ym[1] = 1;
    } else {
        $ym[1]++;
    }
    $d = mktime( 0, 0, 0, $ym[1], 1, $ym[0] );
    $d -= 86400;
    $end = date("Y-m-d", $d);
    return array( $start, $end );
}

週の境界を取得する場合、WPにはそのための関数が既に付属していますget_weekstartend($time);。これは、境界を配列として配信します。

その後、meta_query2つの別々の比較を行うことにより、これらを引数で使用できます。


「MySQLタイムスタンプの形式はY-m-d G:i:s」という意味ではありませんか?G:i:s24時間、h:i:s12時間です。
admcfajn

3

私は次のようになりました。イベントママフィールドを設定し、そこから比較します。助けてくれてありがとう

<?php 
        $event_query = new WP_Query(
        array( 
          'post_type'   => 'event',        // only query events
          'meta_key'    => 'event-month',  // load up the event_date meta
          'order_by'        => 'event_date',
          'order'       => 'asc',         // ascending, so earlier events first
          'meta_query'  => array(
             array(         // restrict posts based on meta values
              'key'     => 'event-month',  // which meta to query
              'value'   => date("n"),  // value for comparison
              'compare' => '=',          // method of comparison
              'type'    => 'NUMERIC'         // datatype, we don't want to compare the string values
            ) // meta_query is an array of query ites
           ) // end meta_query array
          ) // end array
        ); // close WP_Query constructor call

 ?>
   <?php while($event_query->have_posts()): $event_query->the_post(); //loop for events ?>

1

こんにちは、私はソリューションを投稿しています。Y-m-d H:i形式で日付を保存した場所(2013-07-31 16:45など)。

  • イベント開始日に従って並べ替えられます。
  • 今日以降に終了するイベントはのみでクエリされmeta_queryます。

    date_default_timezone_set('Asia/Calcutta');

date()機能のデフォルトのタイムゾーンを設定します。

$args = array(
    'posts_per_page'  => 3,
    'orderby'         => 'meta_value',
    'meta_key'    => 'event_start_date_time',
    'order'           => 'ASC',
    'post_type'       => 'events',
    'meta_query' => array(
      array(
        'key' => 'event_end_date_time',
        'value' => date("Y-m-d H:i"),
        'compare' => '>=',
        'type' => 'DATE'
        )
      )
    ); 
query_posts( $args );

if( have_posts() ) : while ( have_posts() ) : the_post();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.