我会这样做:
代码
function my_pseudo_date_query( $where, $query ) {
global $wpdb;
$dq = $query->get(\'my_date_query\');
if( $dq && !empty( $dq[\'after\'] ) ){
$where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_date >= %s"
$dq[\'after\']
);
}
if( $dq && !empty( $dq[\'before\'] ) ){
$where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_date <= %s",
$dq[\'before\']
);
}
return $where;
}
add_filter( \'post_where\', \'my_pseudo_date_query\', 10, 2 );
用法示例:
$now = new DateTime( \'now\' );
$first_of_last_month = new DateTime( \'first day of last month\' );
$my_query = new WP_Query( array(
\'my_date_query\' => array(
\'before\' => $now->format( \'Y-m-d H:i:s\' ),
\'after\' => $first_of_last_month->format( \'Y-m-d H:i:s\' ),
);
) );
在本例中,before参数是多余的。
备注
- 这还没有经过测试,这是“原则上”的代码我在这里很懒
before
和after
的键my_date_query
属性非常严格。他们必须在Y-m-d H:i:s
(php)格式。但这就足够了如评论中所述WordPress 3.7 将提供date_query
作为论据。上述代码是“向前兼容”的,因为一旦升级到3.7,就可以删除my_
示例中的前缀示例假设PHP5.3+. 尽管解决这个限制相当简单 - 如果与一起使用
get_posts()
别忘了设置suppress_filters
到false.