問題描述
目前我已經使用 posts_where 篩選器在兩個日期之間迴圈列出了兩個日期之間的帖子:
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;
在名為 original_date 的 meta_key 中,我為每個要使用的文章儲存不同的日期,而不是 post_date 。如何正確地將 meta_key 呼叫到 $where 查詢中以達到與 post_date 相同的目的?
$where .= " AND [meta_key=original_date] >= '2000-01-01' AND [meta_key=original_date] <= '2004-12-31' ";
例如,以下 SQL 查詢似乎不起作用,即使正確的值 (2001-10-29,2004-11-03 等) 存在於 original_date meta_key 的帖子中:
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' ";
而使用其 post_date 作為參考,以下作品在同一帖子中正常工作:
$where .= " AND post_date >= '2000-01-01' AND post_date <= 2004-12-31' ";
也許 meta_value 陣列需要剝離一些外來材料,以便將結果格式化為與 post_date 相同的形式?我們該怎麼辦?
最佳解決方案
感謝 AmbitiousAmoeba 的答案。以下改進的程式碼解決了這個問題:
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;
次佳解決方案
如果 where 子句中有未知列 wp_postmeta.meta_key
您可能希望將 $wpdb->postmeta 表加入此查詢:
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');
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。