Không thể so sánh ngày trong meta_query


7

Đây là đoạn mã tôi sử dụng để nhận các bài đăng sự kiện có siêu dữ liệu ngày mới hơn ngày hôm nay:

    <?php
        query_posts( array(
        'post_type' => 'concerts',
        'meta_key' => 'numericdate',
        'posts_per_page' => -1,
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'meta_query' => array(
            array(
                'key' => 'numericdate',
                'value' => date('dmY'),
                'compare' => '>=',
                'type' => 'date'
                 )
           )
    ) );
    if (have_posts()) : ?>

Điều này trả về không có kết quả. Trường "số hóa" chứa chuỗi "ddmmyyyy", vì vậy tôi dự kiến ​​so sánh với giá trị ngày "dmY" hôm nay sẽ hoạt động. Tôi đã sai. Hoặc có một số sai lầm trong mã ở trên. Cảm ơn bạn đã giúp đỡ !

Câu trả lời:


6

Tôi có chính xác vấn đề tương tự ở đây, ngoại trừ tôi sử dụng tiêu chuẩn. loại bài đăng (bài) và một thể loại trong truy vấn của tôi. tất cả mọi thứ hoạt động ngoại trừ thứ tự sắp xếp.

$d = date("Y-m-d");
$args = array(
    'post_type'         => 'post',
    'category_name'     => 'events',
    'post_status'       => 'publish,draft,pending,future,private', // just for me
    'meta_key'          => 'event_start',
    'orderby'           => 'meta_value_num',
    'order'             => 'ASC',
    'posts_per_page'    => -1,
    'meta_query'        => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);

Tuy nhiên, bài viết của tôi được sắp xếp theo So sánh chuỗi. tôi đã làm gì sai?

Sau một thời gian thử nghiệm và tôi đã phát hiện ra rằng thay vì 'meta_value_num' tôi nên sử dụng 'meta_value':

$d = date("Y-m-d");
$args = array(
    'post_type'             => 'post',
    'category_name'     => 'events',
    'post_status'           => 'publish,draft,pending,future,private',
    'meta_key'              => 'event_start',
    'orderby'               => 'meta_value',
    'order'                     => 'ASC',
    'posts_per_page'        => -1,
    'meta_query'            => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);

Ymd là định dạng đúng - tôi đã thử một vài và điều này cho tôi kết quả chính xác.
Simon Pollard

4

Đối với giá trị của nó, hãy sử dụng wordpress current_time () cho loại truy vấn này.

current_time('mysql') cho thời gian máy chủ theo cài đặt quản trị viên được chấp nhận bởi MySQL


3

Tôi tin rằng định dạng ngày của MySQL phải là YYYY-MM-DD. Ngoài ra tôi nghĩ orderby nên là meta_value_num, nếu không các giá trị được coi là chuỗi.


1
Thật vậy, CAST()hoạt động sẽ trở lại NULLnếu dữ liệu của bạn không đúng định dạng. Nó cũng chấp nhận YYYYMMDDmà không có dải phân cách, nhưng không DDMMYYYY. Tôi không biết về orderby- nó có sử dụng các giá trị được chọn của truy vấn meta không?
Jan Fabry

Cảm ơn Milo, bây giờ nó hoạt động như một bùa mê! meta_value_num đã thực hiện đúng công việc, tôi tự hỏi tại sao không ai nhận thấy một chi tiết như vậy trong chủ đề tương tự này: bit.ly/l88vup
Pierre

0

Bỏ qua các ưu tiên định dạng ngày của MySQL, có rất nhiều lý do chính đáng để sử dụng các định dạng bigendian như Ymd.

Bạn sẽ nghĩ rằng so sánh ngày sẽ là rõ ràng, nhưng ...

05262011> 01012012

và như thế. Bạn sẽ gây ra cho mình rất nhiều vấn đề khi cố gắng sử dụng định dạng dmY.

Ngoài ra, tôi không nghĩ rằng 'ngày' là một trong những tham số được chấp nhận cho "loại" meta_query. Để tham số đó ra và sử dụng so sánh chuỗi để có kết quả tốt nhất.


1
ngày là hợp lệ, từ mục nhập WP_Query trong bộ mã Giá trị mặc định là 'CHAR'.
Milo

0

Nếu ai đó có cùng một vấn đề, tốt hơn bạn nên xem bộ lọc tests_clauses .
Nó cho phép bạn tự thao tác SQL truy vấn.
Ở đó bạn có thể chuyển đổi giá trị cột ngày và thay đổi mệnh đề where và mệnh đề orderby.

$pieces['where'] .= " AND STR_TO_DATE(wp_postmeta.meta_value,'%d%m%Y' ) >= 
  CURRENT_DATE() ";

$pieces['orderby'] = "STR_TO_DATE( wp_postmeta.meta_value,'%d%m%Y' ) DESC";
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.