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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.