关于 WordPress 3.7 引入的 WP_Date_Query

WordPress 日前开始了 3.7 版公开测试,宣布引入了一个使用日期时间作为查询参数的新类 WP_Date_Query,以增强 WordPress 主查询 WP_Query 函数的功能。其主要针对的是查询某个日期前或后,或者某个日期范围内的内容的需要。

WP_Date_Query 目前位于 WordPress 安装目录的 wp-includes 文件夹中,文件名为 date.php。文档中同时给出了日期参数设定格式及要求。关于日期时间格式可以参考 PHP 文档 date 中的描述。

$date_query = new WP_Date_Query( array(
		'column' => '可选,日期查询针对的数据列,默认为 post_date',
		'compare' => '可选,一些比较运算的符号,在 WP_Date_Query::get_compare()中 有定义(如 '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN')',
 		'relation' => '可选,OR 或者 AND,当下面紧接着设定的日期数组超过 2 组时,通过这个参数来决定其组合关系,默认为 AND',
		array(
			'column' => '要求同上',
			'compare' => '要求同上',
			'after' => '字符串或数组,参考 WP_Date_Query::build_mysql_datetime()',
			'before' => '字符串或数组,参考 WP_Date_Query::build_mysql_datetime()',
			'inclusive' => '布尔值,针对上面的 after/before,是否要精确匹配给定日期',
			'year' => '4 位整数',
			'month' => '整数,1-12',
			'week' => '整数,0-53',
			'day' => '整数,1-31',
			'hour' => '整数,0-23',
			'minute' => '整数,0-60',
			'second' => '整数,0-60',
		),
		array(
			...
		),
		...
) );

可以将此参数设定包含在 WP_Query 的参数之中,如:

$args = array(
                     'post_status'      => 'publish',
		     'post_type'        => 'post',
		     'order'            => 'DESC',
		     'date_query'       => $date_query,
  		     'paged'            => $paged
);

WP_Date_Query 主要作者是 Viper007Bond,他在自己的博客上列举了 WP_Date_Query 的几个示例(via)。

示例 1:查询最近 10 篇发表于周末早上 9 点到下午 5 点之间的文章

// Get the 10 most recent posts made
// between 9AM and 5PM on weekdays
$some_posts = new WP_Query( array(
    'date_query' => array(
        array(
            'hour' => 9,
            'compare' => '>=',
        ),
        array(
            'hour' => 17,
            'compare' => '<=',
         ),
        array(
            'dayofweek' => array( 2, 6 ),
            'compare' => 'BETWEEN',
        ),
    ),
    'posts_per_page' => 10,
) );

示例 2:查询今年夏天发表的文章,日期范围:7月1日到8月31日。这里使用了兼容 PHP strtotime() 函数的字符串表示日期。

// Get all posts from this summer
// June 1st to August 31st, inclusive
// Note that strtotime()-compatible strings can be used
$some_posts = new WP_Query( array(
    'date_query' => array(
        array(
            // 使用 strtotime() 转换的字符串
            'after'     => 'June 1st, 2013',
            // Or if you want, an array
            'before'    => array(
                'year'  => 2013,
                'month' => 8,
                'day'   => 31,
            ),
            'inclusive' => true,
        ),
    ),
    'posts_per_page' => -1,
) );

示例 3:查询所有发表于 1 年前,但是最近一个月有修改过的文章。

// Any posts made over a year ago
// but modified in the past month
$some_posts = new WP_Query( array(
    'date_query' => array(
        array(
            'column' => 'post_date_gmt',
            // 注意这里也使用了字符串表达日期
            'before' => '1 year ago',
        ),
        array(
            'column' => 'post_modified_gmt',
            'after'  => '1 month ago',
        )
    ),
    'posts_per_page' => -1,
) );

当然也可以用来查询评论。

示例 4:查询文章 ID 为 123 的所有评论中发表于最近 1 周的评论。

// All comments from post ID 123
// that are within the past week
$some_comments = get_comments( array(
    'post_ID' => 123,
    'date_query' => array(
        array(
            'after' => '1 week ago',
        ),
    ),
) );

新引入的日期查询参数增强了 WP_Query 针对日期的查询能力,但是原来的日期时间查询方式依然可以正常使用。只有当我们需要针对更复杂的日期时间相关内容进行查询的时候才需要用到 WP_Date_Query。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/wp_date_query-in-wordpress-3-7/>。转载请保留此信息及相应链接。

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>