เป็นวิธีที่ถูกต้องในการเปรียบเทียบวันที่ใน WP query_posts meta_query


32

ฉันมีการสืบค้น query_posts ในเทมเพลต WP ด้วยการใช้ปลั๊กอิน More Fields ฉันสามารถให้ความสามารถแก่ผู้ดูแลไซต์ในการสร้างกิจกรรม (ประเภทโพสต์ที่กำหนดเอง) จากนั้นป้อนวันที่ซึ่งจัดรูปแบบแล้ว: YYYY / mm / dd

คำถามหลักคือ; ฉันควรส่งผ่านค่าใดไปยังตัวเลือกค่าในอาร์เรย์ meta_query ขณะนี้ฉันกำลังพยายามผ่าน "วันที่ (" Y / m / dh: ฉัน A ")" (ลบเครื่องหมายคำพูด) เนื่องจากฉันเข้าใจแล้วว่าจะพิมพ์วันที่ปัจจุบันวันนี้ ฉันไม่สนใจเกี่ยวกับช่วงเวลาที่จะไม่เกี่ยวข้อง Ulitimatly ฉันพยายามใช้ตัวเลือกการเปรียบเทียบเพื่อแสดงเหตุการณ์ที่กำลังจะเกิดขึ้นเหตุการณ์ที่ผ่านมาในสถานที่ต่าง ๆ ในเว็บไซต์นี้ ในอีกจุดหนึ่งที่จริงฉันต้องผ่านตัวเลือกค่าอาร์เรย์ที่พิมพ์ว่าวันแรกและวันสุดท้ายของเดือนปัจจุบัน จำกัด การส่งออกไปยังเหตุการณ์ที่เกิดขึ้นในเดือนนี้

<?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'?
Francisco Corrales Morales

ฉันสามารถยืนยันข้อสงสัยของ @FranciscoCorralesMorales: คุณต้องระบุประเภท 'DATE' โดยเฉพาะอย่างยิ่งเนื่องจากเขตข้อมูล meta วันที่ไม่ได้บันทึกเป็นตัวเลข แต่อยู่ในรูปแบบของ "Ymd" (โปรดทราบเครื่องหมายขีดกลาง) ฉันแก้ไขคำตอบของโจนาธานแล้ว
Marco Panichi

สำหรับความเป็นสากลคุณอาจต้องการใช้ฟังก์ชั่น WordPress date_i18n()แทน php date()เนทีฟ
Jake

7

ส่วนใหญ่ขึ้นอยู่กับวิธีการจัดเก็บวันที่ของคุณในค่าเมตาตั้งแต่แรก โดยทั่วไปเป็นความคิดที่ดีที่จะเก็บวันที่ใน MySQL เป็นวันที่ / เวลาของ MySQL

timestamps MySQL Y-m-d h:i:sมีรูปแบบ

อย่างไรก็ตามมันเป็นความคิดที่ดีเสมอที่จะใช้ฟังก์ชั่น mangling date ของ 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_timestampstrtotime($user_input)

อย่างไรก็ตามstrtotime()อย่าทำการตรวจสอบสติของตัวเองดังนั้นจึงเป็นการดีที่สุดที่จะเขียนฟังก์ชั่น converstion ของคุณเอง

สำหรับการรับช่วงเดือนนี่คือฟังก์ชันที่ฉันใช้เพื่อรับขอบเขตเดือนสำหรับการประทับเวลา 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_queryโต้แย้งของคุณโดยทำการเปรียบเทียบสองแบบแยกกัน


คุณไม่ได้หมายถึง "MySQL timestamps มีรูปแบบY-m-d G:i:s" หรือไม่? G:i:sคือ 24 ชั่วโมงh:i:sคือ 12 ชั่วโมง
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.