Custom Field Date Problem

时间:2010-12-10 作者:Keith Donegan

我有一个名为expiry\\u date的自定义字段,其值为2010-12-11 00:00:00。

我想做的是,在我的查询循环中,只返回附加了此expiry\\u date自定义字段并符合以下条件的帖子:

expire\\u date自定义字段中的日期必须在到期后的24小时内,如果超过当前日期,则该帖子将“过期”,并且不会显示在循环中,或者如果该帖子在到期后的25小时内,也不会显示,等等

2 个回复
SO网友:onetrickpony

我同意丹尼斯的观点,我不喜欢使用自定义字段来处理这类内容,但我还不知道还有什么其他方法。。。

通过更改循环的SQL查询,您可以做什么,如下所示:

add_filter(\'posts_join\', \'my_post_filter_join\');
function my_post_filter_join($join) {
  global $wpdb;
  if(is_home() || is_category() || is_search())
    $join .= " LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)";
  return $join;
}

add_filter(\'posts_where\', \'my_post_filter_where\');
function my_post_filter_where($where) {
  global $wpdb;

  // current date in unix format
  $current_time = current_time("timestamp");

  // exclude any posts older than your expiry date set in the custom field
  if(is_home()|| is_category() || is_search())
    $where .= " AND ($wpdb->postmeta.meta_key = \'expiry_date\' AND $wpdb->postmeta.meta_value > \'{$current_time}\')";
  return $where;
}
我在这里使用unix时间戳而不是格式化的日期字符串,您也应该这样做,这样更容易处理。对于管理界面,您可以使用日期选择器,并在保存帖子时将日期转换为时间戳。。。

SO网友:Denis de Bernardy

你在寻找一个BETWEEN子句,这是我脑子里想不出来的。

您可以通过使用两个元子句来解决这个问题,一个>=和另一个<;=,都在同一个元键上。WP可能会两次加入元表,这对性能来说不是很好,但它会起作用。

或者,使用posts\\u join和posts\\u where过滤器。

哦,还有。。。如果需要提醒,如果您有大量数据,那么您的查询会很慢,因为缺少对元值的索引。我不知道您的用例可能是关于什么的,但听起来像是在原始表中添加一个额外字段才是正确的方式。

结束

相关推荐

带有“Offset”参数的WP_QUERY

我正在使用以下内容对帖子进行自定义查询:$p = new WP_Query(); $p->query(array(\'offset\' => 30, \'posts_per_page\' => 10)); 如果我在整个博客上有36篇帖子,$p->post_count 将返回检索到的帖子数,在本例中为6。我需要获得post计数,就像我忽略这2个参数一样(这样我可以计算剩余的post计数)。我怎样才能做到这一点,而不必再提出另一个问题?