apa cara yang benar untuk membandingkan tanggal dalam WP query_posts meta_query

32

Saya memiliki panggilan query_posts dalam templat WP. Melalui penggunaan More Fields Plugin saya dapat memberikan admin situs kemampuan untuk membuat acara (jenis posting khusus) dan kemudian memasukkan tanggal yang diformat: YYYY / mm / dd.

Pertanyaan utamanya adalah; nilai apa yang harus saya sampaikan ke opsi nilai dalam array meta_query? Saat ini saya mencoba untuk melewati "date (" Y / m / dh: i A ")" (minus tanda kutip), karena, seperti yang saya pahami, itu akan mencetak tanggal saat ini hari ini. Saya tidak peduli tentang waktu berkencan sehingga mungkin tidak relevan. Akhirnya saya mencoba menggunakan opsi bandingkan untuk memakukan acara mendatang, melewati acara di berbagai tempat di situs ini. Di satu tempat lain saya benar-benar harus meneruskan opsi nilai array yang mencetak hari pertama dan terakhir bulan ini, membatasi output untuk peristiwa yang terjadi bulan ini.

<?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
                 ?>
tjsherrill
sumber

Jawaban:

44

Saya akhirnya mengerjakan hal yang sama persis dan posting ini sangat membantu. Saya menggunakan Bidang Kustom dan di sini adalah kode yang saya gunakan untuk membuat daftar semua acara yang lebih besar dari tanggal saat ini. Perhatikan filter berbasis taksonomi ekstra.

<?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',
                )
            )
        )
    );
?>
Jonathan Wold
sumber
5
mengapa tidak 'type' => 'DATE'?
Francisco Corrales Morales
Saya dapat mengkonfirmasi keraguan @FranciscoCorralesMorales: Anda harus menentukan tipe 'DATE', terutama karena bidang meta tanggal tidak disimpan sebagai angka tetapi dalam bentuk "Ymd" (harap dicatat tanda hubung). Saya sudah mengedit jawaban Jonathan.
Marco Panichi
Untuk internasionalisasi, Anda mungkin ingin menggunakan fungsi WordPress date_i18n(), bukan asli php date().
Jake
7

Ini sangat tergantung pada bagaimana tanggal Anda disimpan dalam nilai meta di tempat pertama. Secara umum, itu ide yang baik untuk menyimpan tanggal di MySQL sebagai tanggal / cap waktu MySQL.

Stempel waktu MySQL memiliki format Y-m-d h:i:s.

Namun, itu selalu merupakan ide yang baik untuk menggunakan fungsi mangling tanggal WP sendiri. Dengan demikian, untuk mendapatkan tanggal saat ini dalam format MySQL, gunakan current_time('mysql').

Untuk memformat tanggal MySQL untuk tampilan, gunakan mysql2date($format, $mysql_date). Dalam hal ini yang terbaik adalah menampilkan tanggal yang dikonfigurasi dalam pengaturan, jadi gunakan $format = get_option('date_format');.

Untuk menyimpan tanggal yang dipilih pengguna, Anda harus mentranskodekannya menjadi tanggal MySQL. Untuk melakukannya, cara termudah - tetapi tidak paling aman adalah date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestampseringkali dapat diturunkan melaluistrtotime($user_input) .

Namun, strtotime()jangan lakukan pemeriksaan kewarasan sendiri, jadi sebaiknya tulis fungsi percakapan Anda sendiri.

Adapun untuk mendapatkan rentang bulan, inilah fungsi yang saya gunakan untuk mendapatkan batas bulan untuk setiap timestamp 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 );
}

Jika Anda ingin mendapatkan batas minggu, WP sudah dilengkapi dengan fungsi untuk itu:, get_weekstartend($time);yang juga memberikan batas sebagai array.

Anda kemudian dapat menggunakan ini dalam meta_queryargumen Anda dengan melakukan dua perbandingan terpisah.

wyrfel
sumber
Bukankah maksud Anda "cap waktu MySQL memiliki format Y-m-d G:i:s"? G:i:sadalah 24 jam, h:i:s12 jam.
admcfajn
3

Saya akhirnya pergi dengan yang berikut ini. Saya menyiapkan bidang event-momth dan membandingkan dari sana. Terima kasih untuk bantuannya

<?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 ?>
tjsherrill
sumber
1

Hai, di bawah ini saya memposting solusi saya. Di mana saya telah menyimpan tanggal dalam Y-m-d H:iformat (seperti 2013-07-31 16:45).

  • Diurutkan sesuai dengan tanggal mulai Acara.
  • Acara yang berakhir setelah Hari ini hanya akan ditanyakan oleh meta_query.

    date_default_timezone_set('Asia/Calcutta');

Saya menetapkan zona waktu default untuk date()fungsi.

$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();
Makarand Mane
sumber