cách chính xác để so sánh ngày trong một meta_query của WP query_posts


32

Tôi có một lệnh gọi query_posts trong mẫu WP. Thông qua việc sử dụng Trình cắm thêm trường, tôi có thể cung cấp cho quản trị viên trang web khả năng tạo sự kiện (loại bài đăng tùy chỉnh) và sau đó nhập ngày được định dạng: YYYY / mm / dd.

Câu hỏi chính là; Tôi nên chuyển giá trị nào cho tùy chọn giá trị trong mảng meta_query? Tôi hiện đang cố gắng vượt qua "ngày (" Y / m / dh: i A ")" (trừ các trích dẫn), bởi vì, theo tôi hiểu, nó sẽ in ngày hiện tại ngày hôm nay. Tôi không quan tâm đến thời gian hẹn hò để có thể không liên quan. Ulitimatly Tôi đang cố gắng sử dụng tùy chọn so sánh để hiển thị các sự kiện sắp tới, các sự kiện trong quá khứ ở các địa điểm khác nhau trên trang web này. Ở một vị trí khác, tôi thực sự cần phải vượt qua tùy chọn giá trị một mảng in ngày đầu tiên và ngày cuối cùng của tháng hiện tại, giới hạn đầu ra cho các sự kiện xảy ra trong tháng này.

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

Câu trả lời:


44

Tôi cố gắng làm việc trên cùng một điều chính xác và bài viết này rất hữu ích. Tôi đã sử dụng Trường tùy chỉnh và đây là mã mà tôi đã sử dụng để tạo danh sách tất cả các sự kiện lớn hơn ngày hiện tại. Lưu ý các bộ lọc dựa trên phân loại bổ sung.

<?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
tại sao không 'type' => 'DATE'?
Francisco Corrales Morales

Tôi có thể xác nhận sự nghi ngờ của @FranciscoCorralesMorales: bạn phải chỉ định loại 'NGÀY', đặc biệt vì các trường meta ngày không được lưu dưới dạng số nhưng ở dạng "Ymd" (vui lòng lưu ý dấu gạch nối). Tôi đã chỉnh sửa câu trả lời của Jonathan.
Marco Panichi

Để quốc tế hóa, bạn có thể muốn sử dụng chức năng WordPress date_i18n(), thay vì php bản địa date().
Jake

7

Nó chủ yếu phụ thuộc vào cách ngày của bạn được lưu trữ trong giá trị meta ở vị trí đầu tiên. Nói chung, nên lưu trữ ngày trong MySQL dưới dạng ngày / dấu thời gian của MySQL.

Dấu thời gian của MySQL có định dạng Y-m-d h:i:s.

Tuy nhiên, luôn luôn là một ý tưởng tốt để sử dụng các chức năng xáo trộn ngày của riêng WP. Như vậy, để có được ngày hiện tại ở định dạng MySQL, hãy sử dụng current_time('mysql').

Để định dạng một ngày MySQL để hiển thị, sử dụng mysql2date($format, $mysql_date). Trong trường hợp này, tốt nhất là hiển thị ngày như được định cấu hình trong cài đặt, vì vậy hãy sử dụng $format = get_option('date_format');.

Để lưu trữ một ngày do người dùng chọn, bạn sẽ phải chuyển mã thành ngày MySQL. Để làm như vậy, cách dễ nhất - nhưng không an toàn nhất là date('Y-m-d h:i:s', $unix_timestamp);. $unix_timestampthường có thể được bắt nguồn qua strtotime($user_input).

Tuy nhiên, strtotime()không tự kiểm tra độ tỉnh táo, vì vậy tốt nhất bạn nên viết chức năng hội tụ của riêng mình.

Đối với việc lấy phạm vi tháng, đây là một chức năng tôi đang sử dụng để có được ranh giới tháng cho bất kỳ dấu thời gian nào của 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 );
}

Nếu bạn muốn có được các ranh giới trong tuần, WP đã đi kèm với một chức năng cho điều đó : get_weekstartend($time);, cũng cung cấp các ranh giới dưới dạng một mảng.

Sau đó, bạn có thể sử dụng những điều này trong meta_queryđối số của mình bằng cách thực hiện hai so sánh riêng biệt.


Bạn không có nghĩa là "dấu thời gian MySQL có định dạng Y-m-d G:i:s"? G:i:slà 24 giờ, h:i:slà 12 giờ.
admcfajn

3

Tôi lên vết thương với những điều sau đây. Tôi thiết lập một trường sự kiện thứ hai và so sánh từ đó. cảm ơn đã giúp đỡ

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

Xin chào bên dưới tôi đang đăng giải pháp của tôi. Nơi tôi đã lưu trữ ngày ở Y-m-d H:iđịnh dạng (như 2013-07-31 16:45).

  • Sắp xếp theo ngày bắt đầu sự kiện.
  • Sự kiện kết thúc sau Hôm nay sẽ chỉ được truy vấn meta_query.

    date_default_timezone_set('Asia/Calcutta');

Tôi đặt múi giờ mặc định cho date()chức năng.

$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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.