问题描述

目前我已经使用 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_datemeta_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-292004-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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。