WP query_posts meta_query'deki tarihleri ​​karşılaştırmanın doğru yolu nedir


32

Bir WP şablonunda bir query_posts çağrısı var. Daha Fazla Alan Eklentisinin kullanılmasıyla, site yöneticisine bir etkinlik oluşturma yeteneği verebilir (özel yazı türü) ve ardından biçimlendirilmiş bir tarih girebilirim: YYYY / mm / gg.

Asıl soru; meta_query dizisindeki değer seçeneğine hangi değeri geçmeliyim? Şu anda "tarih (" Y / m / dh: i A ")" (tırnak eksi) geçmeye çalışıyorum, çünkü anladığım kadarıyla bugünün tarihini yazdıracak. Randevu saatini umursamıyorum bu yüzden konu dışı olabilir. Nihayetinde, karşılaştırmalı seçeneği kullanarak yaklaşmakta olan olayları, bu sitedeki farklı yerlerde geçmiş olayları göstermek için çivilemek için kullanmaya çalışıyorum. Başka bir noktada, değer seçeneğini geçerli ayın ilk ve son gününü basan ve çıktıyı bu ay gerçekleşen olaylarla sınırlayan bir diziyi geçmem gerekiyor.

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

Yanıtlar:


44

Aynı şey üzerinde çalışarak yaralandım ve bu yazı çok yardımcı oldu. Özel Alanlar'ı kullandım ve işte geçerli tarihten daha büyük tüm olayların bir listesini oluşturmak için kullandığım kod . Ekstra taksonomi bazlı filtrelere dikkat edin.

<?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
neden olmasın 'type' => 'DATE'?
Francisco Corrales Morales

@FranciscoCorralesMorales'ın şüphelerini teyit edebilirim: 'tarih' türünü belirtmelisiniz, çünkü özellikle tarih meta alanları sayı olarak kaydedilmediğinden ancak "Ymd" biçiminde (lütfen tire işaretleyin). Jonathan'ın cevabını değiştirdim.
Marco Panichi

Uluslararasılaştırma için, date_i18n()php native yerine WordPress işlevini kullanmak isteyebilirsiniz date().
Jake,

7

Bu, büyük ölçüde, tarihinizin ilk etapta meta değerinde nasıl depolandığına bağlıdır. Genel olarak, tarihleri ​​MySQL'de MySQL tarihleri ​​/ zaman damgaları olarak depolamak iyi bir fikirdir.

MySQL zaman damgaları biçimine sahiptir Y-m-d h:i:s.

Ancak, WP'nin kendi tarih yönetim fonksiyonlarını kullanmak her zaman iyi bir fikirdir. Bu nedenle, geçerli tarihi MySQL biçiminde almak için kullanın current_time('mysql').

Görüntüleme için bir MySQL tarihini biçimlendirmek için kullanın mysql2date($format, $mysql_date). Bu durumda ayarlarda yapılandırılan tarihi görüntülemek en iyisidir, bu nedenle kullanın $format = get_option('date_format');.

Kullanıcı tarafından seçilen bir tarihi saklamak için, tarihi MySQL tarihine dönüştürmeniz gerekir. Bunu yapmak için, en kolay - ama en güvenli değil - yoludur date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestampgenellikle üzerinden elde edilebilir strtotime($user_input).

Ancak, strtotime()akıl sağlığı kontrolleri kendi başına yapmaz, bu yüzden kendi konuşma fonksiyonunuzu yazmak en iyisidir.

Ay aralığına gelince, işte herhangi bir MySQL zaman damgası için ay sınırlarını elde etmek için kullandığım bir işlev:

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 );
}

Hafta sınırlarını almak istiyorsanız, WP zaten bunun için bir fonksiyonla gelir: get_weekstartend($time);Sınırları bir dizi olarak da sunar.

Ardından bunları meta_queryiki ayrı karşılaştırma yaparak argümanlarınızda kullanabilirsiniz .


"MySQL zaman damgalarının formatı var" anlamına gelmiyor Y-m-d G:i:smu? G:i:s24 saat, h:i:s12 saattir.
admcfajn

3

Aşağıdakileri takip ederek yaralandım. Bir olay anı alanı kurup oradan karşılaştırarak karşılaştırıyorum. yardım için teşekkürler

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

Aşağıda merhaba Çözümümü gönderiyorum. Tarihi Y-m-d H:iformatta sakladığım yer (2013-07-31 16:45 gibi).

  • Etkinlik başlangıç ​​tarihine göre sıralandı.
  • Bugünden sonra sona eren olay, yalnızca tarafından sorgulanır meta_query.

    date_default_timezone_set('Asia/Calcutta');

date()İşlev için varsayılan zaman dilimini ayarladım .

$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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.