在WP_Query
本系列WP_Query
,您已经学习了如何使用WP_Query
类在主题文件或插件中创建自定义查询。
本系列的这一部分将带您了解可用于创建简单日期和复杂日期查询的参数,以输出在给定日期,之前,之后或之间发布的帖子。
我将向您展示可用的参数以及如何使用它们编写查询。 但是首先要提醒一下WP_Query
参数如何工作。
WP_Query中的参数工作原理回顾
在开始之前,让我们快速回顾一下WP_Query
参数如何工作。 在主题或插件中编码WP_Query
时,需要包括四个主要元素:
- 查询参数,使用本教程将介绍的参数
- 查询本身
- 循环
- 完成:关闭if和while标签并重置发布数据
实际上,这将类似于以下内容:
<?php
$args = array(
// Arguments for your query.
);
// Custom query.
$query = new WP_Query( $args );
// Check that we have query results.
if ( $query->have_posts() ) {
// Start looping over the query results.
while ( $query->have_posts() ) {
$query->the_post();
// Contents of the queried post results go here.
}
}
// Restore original post data.
wp_reset_postdata();
?>
参数是什么告诉WordPress从数据库中获取什么数据,这就是我将在这里介绍的数据。 因此,我们在这里只关注代码的第一部分:
$args = array(
// Arguments for your query.
);
如您所见,参数包含在数组中。 在学习本教程时,您将学习如何对它们进行编码。
编写您的论点
有一种特定的方式可以对数组中的参数进行编码,如下所示:
$args = array(
'parameter1' => 'value',
'parameter2' => 'value',
'parameter3' => 'value'
);
您必须将参数及其值用单引号引起来,并在它们之间使用=>
,并用逗号分隔。 如果您弄错了,WordPress可能不会将所有参数添加到查询中,或者会出现白屏。
日期参数
您还可以使用参数来查询具有给定日期的发布日期的帖子。 您可以根据自己的喜好指定日期,例如使用年份和月份检索多个帖子。
您可以编写一组简单的参数,也可以使用date_query
创建嵌套数组并运行更复杂的查询。 让我们从简单的参数开始。
简单日期参数
可用于按日期查询的参数是:
-
year
( int ):四位数的年份(例如2015
)。 -
monthnum
( int ):月数(从1
到12
)。 -
w
( int ):一年中的星期(从0
到53
)。 该模式取决于"start_of_week"
选项,您可以在管理员的“设置”页面中对其进行编辑。 -
day
( int ):月份中的一天(从1
到31
)。 -
hour
( int ):小时(从0
到23
)。 -
minute
( int ):分钟(从0
到60
)。 -
second
( int ):秒(0
到60
)。 -
m
( int ):YearMonth(例如201502
)。
因此,假设您正在运行一个事件站点,该站点使用每个事件的发布日期来表示事件开始日期。 要显示2015年发生的所有过去和将来的事件,以下是您需要的参数:
$args = array(
'post_type' => 'event',
'post_status' => array(
'future',
'publish'
),
'year' => '2015'
);
请注意,我已经使用future
和publish
作为帖子状态,因为默认情况下不会查询安排在将来日期的帖子。
或者,如果您想自动显示今年发生的事件,而不是每年更新查询,则可以先获取当前年份,然后在查询参数中传递该年份:
$current_year = the_date( 'Y' );
$args = array(
'post_type' => 'event',
'post_status' => array(
'future',
'publish'
),
'year' => $current_year
);
复杂的日期参数
要使用多个日期参数来创建更复杂的查询,请使用date_query
参数。 这使您可以访问更多参数:
-
year
( int ):四位数的年份(例如2015
)。 -
month
( int ):月数(从1
到12
)。 -
week
( int ):一年中的星期(从0
到53
)。 -
day
( int ):月份中的一天(从1
到31
)。 -
hour
( int ):小时(从0
到23
)。 -
minute
( int ):分钟(从0
到59
)。 -
second
( int ):秒(0
到59
)。 -
after
( string / array ):之后检索帖子的日期。 -
before
( 字符串/数组 ):之前检索帖子的日期。
-
inclusive
( 布尔 ):对于after / before,是否应匹配精确值。 -
compare
( string ):用于将数据库中的数据与参数进行比较的运算符。 可能的值为'='
,'!='
,'>'
,'>='
,'<'
,'<='
,'LIKE'
,'NOT LIKE'
,'IN'
,'NOT IN'
,'BETWEEN'
,'NOT BETWEEN'
,'EXISTS'
和'NOT EXISTS'
。 -
column
( string ):要查询的数据库列:默认为'post_date'
。 -
relation
( 字符串 ):OR
或AND
,应该如何比较子数组。 默认值为AND
。
date_query
参数的格式如下:
$args = array(
'date_query' => array(
array(
// Arguments go here.
)
)
);
您还可以创建多个数组,并定义如何使用相关参数比较它们。 下面的示例将返回与两个数组中的参数匹配的查询:
$args = array(
'date_query' => array(
'relation' => 'AND',
array(
// Arguments go here.
),
array(
// Arguments go here.
)
)
);
尽管以下代码将获取与任一数组(或两者)中的参数匹配的帖子:
$args = array(
'date_query' => array(
'relation' => 'OR',
array(
// Arguments go here.
),
array(
// Arguments go here.
)
)
);
让我们用一个例子来说明。 假设您正在一家大学网站上工作,并希望显示本学年的帖子。 该学年的学期为2014年9月1日至2015年8月31日,因此您需要查找相关月份和年份的职位:
$args = array(
'date_query' => array(
'relation' => 'OR',
array(
'year' => '2014',
'month' => ( '9, 10, 11, 12' )
),
array(
'year' => '2015',
'month' => ( '1, 2, 3, 4, 5, 6, 7, 8' )
)
)
);
请注意, month
参数的参数为字符串,而不是数组。
前后参数
上面示例的替代方法是使用before
和after
参数定义要显示帖子的日期之前和/或之后。 这些有三个参数:
-
year
( 字符串 ):接受任何四位数的年份:默认为空。 -
month
( 字符串 ):一年中的月份(1
到12
)。 默认值为12
。 -
day
( 字符串 ):月份中的一天(1
到31
)。 默认值为该月的最后一天。
您还可以使用字符串作为日期,只要它与php strtotime
格式兼容即可。
因此,回到显示本学年职位的示例,我还有两个选择。 首先,我可以使用带有year和month参数的嵌套数组:
$args = array(
'date_query' => array(
'relation' => 'AND',
array(
'after' => array(
'year' => '2014',
'month' => '9'
),
'inclusive' => true
),
array(
'before' => array(
'year' => '2015',
'month' => '8'
),
'inclusive' => true
)
)
);
这里有几件事要注意:
- 我使用
'relation' => 'AND'
是因为帖子需要在我的开始日期之后和结束日期之前发布。 - 对于每个嵌套数组,我都使用
'inclusive' => true
来确保WordPress提取2014年9月至2015年8月期间发布的帖子。
我还可以使用字符串作为日期来编写此查询:
$args = array(
'date_query' => array(
array(
'after' => 'August 31st, 2014',
'before' => 'September 1st, 2015',
'inclusive' => false,
)
)
);
请注意,由于日期字符串的工作方式,使用互斥日期更为可靠。 这是因为如果您使用日期字符串,它将在该日期转换为00:00。 因此,要使其发挥作用,请在字符串中也使用时间,或者按照我的方法进行操作,并使用要从其显示帖子的日期之前的日期(以及要从直到显示帖子的日期之后的日期)。
您还可以对日期参数进行其他操作,例如今天发布的显示帖子。 回到我的活动站点,假设我想在活动发生的那天在主页上显示一个大横幅。 我可以为此编写查询,然后如果发现事件,则输出事件的详细信息。 这里是参数:
$args = array(
'post_type' => 'event',
'post_status' => array(
'future',
'publish'
),
'date_query' => array(
array(
'year' => date( 'Y' ),
'month' => date( 'M' ),
'day' => date( 'D' )
)
)
);
使用date()
函数可返回当前日期-我已经使用了三次,以确保获得正确的日,月和年。 请注意,我还包括了post_status
参数,以确保包括今天晚些时候发生的事件。
摘要
有时您不只是要查询所有已发布的帖子。 通过使用WP_Query
类,您可以创建更具体的查询以按日期输出帖子,包括您在给定日期,某个日期之前,某个日期之后或一对日期之间发布的帖子。
date_query
参数与其他参数(例如post_status
结合使用,本系列其他地方将对此进行详细介绍。
翻译自: https://code.tutsplus.com/tutorials/wp_query-arguments-date--cms-23165