Cách gọi chính xác ngày trường tùy chỉnh vào bộ lọc records_where bằng các câu lệnh SQL


7

Hiện tại tôi có các bài viết liệt kê vòng lặp giữa hai ngày bằng posts_wherebộ lọc:

 function filter_where( $where = '' ) {
  $where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";
  return where;
 }
 add_filter('posts_where', 'filter_where');
 query_posts($query_string);
 while (have_posts()) :
   the_post();
   the_content();
 endwhile;

Trong một cuộc meta_keygọi, original_datetôi đã lưu trữ một ngày khác nhau cho mỗi bài đăng mà tôi muốn sử dụng thay vì post_date. Làm thế nào để tôi gọi chính xác điều này meta_keyvào $wheretruy vấn để thực hiện cùng mục đích như post_date?

$where .= " AND [meta_key=original_date] >= '2000-01-01' AND [meta_key=original_date] <= '2004-12-31' ";

Ví dụ, truy vấn SQL sau đây dường như không làm việc, mặc dù giá trị đúng ( 2001-10-29, 2004-11-03, vv) có mặt trong original_date meta_keycác bài viết:

global $wpdb;
 $where .= " AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) >= '2000-01-01' AND (SELECT meta_value FROM $wpdb->postmeta WHERE meta_key='original_date' ) <= '2004-12-31' ";

trong khi các mục sau hoạt động tốt trên cùng các bài đăng sử dụng post_datetham chiếu của chúng:

$where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";

Có lẽ meta_valuemảng cần phải được loại bỏ một số tài liệu không liên quan để định dạng kết quả thành dạng tương tự post_date? Làm thế nào chúng ta có thể tiếp cận điều này?


thử$where .= " AND (($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value >= '2000-01-01') AND ($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value <= '2004-12-31')) ";
— onetrickpony

Câu trả lời:


6

Cảm ơn AmbitiousAmoeba cho câu trả lời. Các mã cải tiến sau đây giải quyết vấn đề:

function filter_where( $where = '' ) {
   global $wpdb;

   $where .= " AND (($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value >= '2000-01-01') AND ($wpdb->postmeta.meta_key = 'original_date' AND $wpdb->postmeta.meta_value <= '2004-12-31')) ";
   return where;
}
add_filter('posts_where', 'filter_where');
query_posts($query_string);
while (have_posts()) :
   the_post();
   the_content();
endwhile;

1
Tôi gặp lỗi sau khi chạy truy vấn cuối cùng trong phpMyAdmin #1054 - Unknown column 'wp_postmeta.meta_key' in 'where clause'. Bạn có thể giúp với điều đó?
— a_fan

3

Nếu bạn có cột Unknown wp_postmeta.meta_keytrong wheremệnh đề

Bạn có thể muốn tham gia $wpdb->postmetabảng vào truy vấn này:

function custom_posts_join($join){
     global $wpdb;

     $join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";

     return $join;
}
add_filter( 'posts_join' , 'custom_posts_join');
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.