描述
WordPress 用户新建自定义对文章的各种查询,都可以(推荐)使用该类。
标准使用示例:
// The Query
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
echo '<ul>';
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
} else {
// no posts found
}
/* 还原原始 Post Data */
wp_reset_postdata();
它的使用过程是不是和我们在模板中操作使用主循环相似?事实如此,而wp_reset_postdata()的作用就是重置主循环数据,使用WP_Query新建自定义查询会改变全局$post变量的值,所以需要重置回当前主循环原始的文章数据,不然后续可能会出现一些意外问题。
多个查询示例:
// The Query
$query1 = new WP_Query( $args );
// The Loop
while ( $query1->have_posts() ) {
$query1->the_post();
echo '<li>' . get_the_title() . '</li>';
}
/* Restore original Post Data
* NB: Because we are using new WP_Query we aren't stomping on the
* original $wp_query and it does not need to be reset with
* wp_reset_query(). We just need to set the post data back up with
* wp_reset_postdata().
*/
wp_reset_postdata();
/* The 2nd Query (without global var) */
$query2 = new WP_Query( $args2 );
// The 2nd Loop
while ( $query2->have_posts() ) {
$query2->the_post();
echo '<li>' . get_the_title( $query2->post->ID ) . '</li>';
}
// Restore original Post Data
wp_reset_postdata();
属性
$query
保存WP类传递给$wp_query对象的查询字符串。$query_vars
包含解析的$query的关联数组:查询变量及其各自值的数组。$queried_object
如果请求是类别、作者、永久链接或页面,则适用。保存有关请求的类别、作者、文章或页面的信息。$queried_object_id
如果请求是类别、作者、永久链接或文章/页面,则保留相应的ID。$posts
从数据库中获取请求的文章。$post_count
正在显示的文章数。$found_posts
找到的与当前查询参数匹配的文章总数$max_num_pages
总页数,结果为:$found_posts / $posts_per_page$current_post
(循环期间可用) 当前显示的文章的索引$post
(循环期间可用) 当前正在显示的文章$is_single,$is_page,$is_archive,$is_preview,$is_date,$is_year,$is_month,$is_time,$is_author,$is_category,$is_tag,$is_tax,$is_search,$is_feed,$is_comment_feed,$is_trackback,$is_home,$is_404,$is_comments_popup,$is_admin,$is_attachment,$is_singular,$is_robots,$is_posts_page,$is_paged
布尔值描述当前是一个什么类型的请求,例如,前3个分别表示:“它是文章详情页吗?”、“它是页面吗?”、“它是任何类型的存档页面吗?”。更详细的介绍请查看条件标签
Author 作者参数
author(int) – 作者idauthor_name(string) – 使用user_nicenameauthor__in(array) – 作者id(从3.7版开始提供).author__not_in(array) – 作者id(从3.7版开始提供).
示例
// 使用作者 id 查询该作者的文章: $query = new WP_Query( array( 'author' => 123 ) ); // 使用作者 ‘user_nicename‘ 查询该作者的文章: $query = new WP_Query( array( 'author_name' => 'rami' ) ); // 查询多个作者的文章: $query = new WP_Query( array( 'author' => '2,6,17,38' ) ); // 通过在id前面加“-”(减号)查询除作者(单个)以外的所有帖子: $query = new WP_Query( array( 'author' => -12 ) ); // 查询多个作者的文章: $query = new WP_Query( array( 'author__in' => array( 2, 6 ) ) ); // 排除多个作者的文章: $query = new WP_Query( array( 'author__not_in' => array( 2, 6 ) ) );
Category 类别参数
cat(int) – 分类idcategory_name(string) – 分类slugcategory__and(array) – 分类idcategory__in(array) – 分类idcategory__not_in(array) – 分类id
示例
// 查询某个分类的文章(包括所有子类),使用分类 id: $query = new WP_Query( array( 'cat' => 4 ) ); // 查询某个分类的文章(包括所有子类),使用分类 slug: $query = new WP_Query( array( 'category_name' => 'staff' ) ); // 查询某个分类的文章(不包括子类),使用分类 id: $query = new WP_Query( array( 'category__in' => 4 ) ); // 查询多个分类的文章,使用分类 id: $query = new WP_Query( array( 'cat' => '2,6,17,38' ) ); // 查询包含任一个这些分类的文章,使用分类 slug(OR): $query = new WP_Query( array( 'category_name' => 'staff,news' ) ); // 查询包含“所有”这些类别的文章(AND): $query = new WP_Query( array( 'category_name' => 'staff+news' ) ); // 通过在类别id前面加“-”(减号)来查询除这些类别之外的所有文章: $query = new WP_Query( array( 'cat' => '-12,-34,-56' ) ); // 查询分类2和6的文章: $query = new WP_Query( array( 'category__and' => array( 2, 6 ) ) ); // 使用 category__in 查询分类2或6的文章 (注意,这不会显示这些类别的任何子类别的文章): $query = new WP_Query( array( 'category__in' => array( 2, 6 ) ) ); // 排除多个分类也可以这样: $query = new WP_Query( array( 'category__not_in' => array( 2, 6 ) ) );
Tag 标签参数
tag(string) – 标签slugtag_id(int) – 标签idtag__and(array) – 标签idtag__in(array) – 标签idtag__not_in(array) – 标签idtag_slug__and(array) – 标签slugtag_slug__in(array) – 标签slug
示例
// 查询某个标签的文章,使用标签 slug: $query = new WP_Query( array( 'tag' => 'cooking' ) ); // 查询某个标签的文章,使用标签 id: $query = new WP_Query( array( 'tag_id' => 13 ) ); // 查询具有这些标签中的“任一”个的文章(OR): $query = new WP_Query( array( 'tag' => 'bread,baking' ) ); // 查询具有全部这些标签的文章(AND): $query = new WP_Query( array( 'tag' => 'bread+baking+recipe' ) ); // 查询同时具有37和47标签的文章(AND): $query = new WP_Query( array( 'tag__and' => array( 37, 47 ) ) ); // 查询具有37或47标签的文章(OR): $query = new WP_Query( array( 'tag__in' => array( 37, 47 ) ) ); // 查询文章不包含37和47这两个标签: $query = new WP_Query( array( 'tag__not_in' => array( 37, 47 ) ) );
tag_slug__in和tag_slug__and除了使用slug外,其他行为和上面相同
Taxonomy 分类法参数
前面章节“分类参数”、“标签参数”所说的分类(category)、标签(tag)都是WordPress内置的分类法(Taxonomy),而此参数则可以查询任意分类法,包括这些内置分类法,当然通常是用于查询我们自定义的分类法。
{tax}(string) – 使用 taxonomyslug. (自3.1版以来已弃用,请使用tax_query).tax_query(array) – taxonomy 参数(3.1版开始支持).relation(string) – 当存在多个内部taxonomy数组时,每个数组之间的逻辑关系。可能的值为AND、OR。只有一个taxonomy数组时不要使用taxonomy(string) – 分类法field(string) –terms参数的查询依据,可能的值为term_id、name、slug或term_taxonomy_id,默认值为term_idterms(int/string/array) – 分类法项目(terms)include_children(boolean) – 对有分级的taxonomies是否包含其子级,默认为trueoperator(string) – 操作测试,可能的值为IN、NOT IN、AND、EXISTS和NOT EXISTS,默认值为IN
示例
查询自定义分类people下的bob(slug)分类
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => 'bob',
),
),
);
$query = new WP_Query( $args );
查询多个自定义分类
查询movie_genre和actor自定义分类,它们的逻辑关系是AND
movie_genre的分类是用slug查询,actor则是按term_id查询
$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'movie_genre',
'field' => 'slug',
'terms' => array( 'action', 'comedy' ),
),
array(
'taxonomy' => 'actor',
'field' => 'term_id',
'terms' => array( 103, 115, 206 ),
'operator' => 'NOT IN',
),
),
);
$query = new WP_Query( $args );
查询分类法的逻辑关系为OR,即查询具有指定category或post_format的文章
$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array( 'quotes' ),
),
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array( 'post-format-quote' ),
),
),
);
$query = new WP_Query( $args );
tax_query子句可以嵌套,以创建更复杂的查询
$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array( 'quotes' ),
),
array(
'relation' => 'AND',
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array( 'post-format-quote' ),
),
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array( 'wisdom' ),
),
),
),
);
$query = new WP_Query( $args );
Search 搜索参数
按关键词搜索查询文章
s(string) – 搜索的关键词
示例
$query = new WP_Query( array( 's' => 'keyword' ) );
加上连接符可以用于排除,例如pillow -sofa会返回包含pillow的文章但不包含sofa(4.4版开始支持).
Post & Page 文章与页面参数
默认的post_type设置仅查询posts,而不是pages
p(int) – 文章idname(string) – 文章slugpage_id(int) – 页面idpagename(string) – 页面slugpost_parent(int) – 指定父页面id,返回子页面,设置为0仅返回顶级条目post_parent__in(array) – 指定父页面id数组,返回子页面(3.6版起支持)post_parent__not_in(array) – 排除父页面id数组,返回子页面(3.6版起支持)post__in(array) – 获取指定id数组的文章。注意:如果你使用了置顶文章,它将被包含在你的查询结果中!要排除置顶文章,请使用ignore_sticky_postspost__not_in(array) – 指定要在查询结果中排除的文章,用id数组post_name__in(array) – 获取指定slug数组的文章(4.4版起支持)
将空数组传递给post__in那么has_posts()将返回true(并且返回所有文章)。所以传递前应该先进行判断,后决定是否WP_Query查询。
示例
// 用文章ID查询 $query = new WP_Query( array( 'p' => 7 ) ); // 用页面ID查询 $query = new WP_Query( array( 'page_id' => 7 ) ); // 用文章/页面slug查询 $query = new WP_Query( array( 'name' => 'about-my-life' ) ); // 用页面slug查询 $query = new WP_Query( array( 'pagename' => 'contact' ) ); // 查询子页面,(格式‘父页面slug/子页面slug’) $query = new WP_Query( array( 'pagename' => 'contact_us/canada' ) ); // 查询子页面,指定父页面id $query = new WP_Query( array( 'post_parent' => 93 ) ); // 仅查询顶级页面,排除所有子级页面 $query = new WP_Query( array( 'post_parent' => 0 ) ); // 查询子post,指定父级的id数组 $query = new WP_Query( array( 'post_parent__in' => array( 2, 5, 12, 14, 20 ) ) ); // 只查询特定的posts $query = new WP_Query( array( 'post_type' => 'page', 'post__in' => array( 2, 5, 12, 14, 20 ) ) ); // 查询所有posts,但排除指定id的post $query = new WP_Query( array( 'post_type' => 'post', 'post__not_in' => array( 2, 5, 12, 14, 20 ) ) );
注意:在同个查询中post__in和post__not_in不能一起使用。同时注意,使用包含逗号分隔列表的字符串在这里不起作用。如果要传递变量,请确保它是一个正确的整数值数组:
// 这是错误的 $exclude_ids = '1,2,3'; $query = new WP_Query( array( 'post__not_in' => array( $exclude_ids ) ) ); // 这样才对 $exclude_ids = array( 1, 2, 3 ); $query = new WP_Query( array( 'post__not_in' => $exclude_ids ) );
Password 密码参数
默认的post_type设置仅查询posts,而不是pages
has_password(bool) –true/false是否查询有密码的文章,null则查询所有文章(3.9版开始支持)post_password(string) – 指定文章密码(3.9版开始支持)
示例
// 仅查询有密码保护的文章 $query = new WP_Query( array( 'has_password' => true ) ); // 仅查询没有密码保护的文章 $query = new WP_Query( array( 'has_password' => false ) ); // 查询有密码和无密码的所有文章 $query = new WP_Query( array( 'has_password' => null ) ); // 查询指定密码的文章 $query = new WP_Query( array( 'post_password' => 'zxcvbn' ) );
Post Type 文章类型参数
查询自定义文章类型的文章用此参数。
post_type(string / array) – 类型,默认值为post。如果进行tax_query查询,默认值变成any;post– post类型,通常所说的文章page– page类型,即页面revision– 修订版attachment– 附件,WP_Query的post_status参数值默认为publish,而附件的默认发布状态是inherit,也就是说在查询的时候,如果没有显式地设置post_status参数值为inherit或any,则不会返回任何附件,参见下文章节“状态参数”。nav_menu_item– 导航菜单项any– 查询任意类型,排除exclude_from_search设置为true的以及修订版。(当我们自定义文章类型时,可以设置exclude_from_search)
示例
// 只查询页面
$query = new WP_Query( array( 'post_type' => 'page' ) );
// 查询任意类型(排除修订版和‘exclude_from_search’设置为true的)
$query = new WP_Query( array( 'post_type' => 'any' ) );
// 查询多个类型,包括自定义类型
$args = array(
'post_type' => array( 'post', 'page', 'movie', 'book' )
);
$query = new WP_Query( $args );
Status 状态参数
post_status(string / array) – 文章的状态,默认值为publish,但如果用户已登录,则会加上private。默认情况下还包括自定义状态。如果查询是在管理环境(管理区域或AJAX调用)中运行的,那么也会添加受保护的状态。默认情况下,受保护的状态为future、draft和pending。publish– 发布状态pending– 待审核draft– 草稿auto-draft– 自动创建的没有内容的草稿future– 计划发布private– 私密,对未登录的用户不可见inherit– 修订trash– 在回收站中 (2.9版开始支持).any– 除了inherit、trash和auto-draft以外的任何状态,自定义文章状态的exclude_from_search设置为true也同样排除。
示例
// 只查询草稿(draft)
$query = new WP_Query( array( 'post_status' => 'draft' ) );
// 查询多种状态
$args = array(
'post_status' => array( 'pending', 'draft', 'future' )
);
$query = new WP_Query( $args );
// 查询所有附件
$args = array(
'post_status' => 'any',
'post_type' => 'attachment'
);
$query = new WP_Query( $args );
Comment 评论参数
自4.9版开始引入$comment_count参数,它可以是整数或数组。
comment_count(int) – 整数,您的CPT必须拥有的评论数量(搜索运算符将执行=操作)comment_count(Array) – 如果comment_count是一个数组,应该有两个参数:value– 评论数量(要进行compare操作比较的数量)compare– 搜索操作,值可以是=、!=、>、>=、<、<=,默认值=
示例
// 查询有20条评论的文章(评论‘=’20)
$args = array(
'post_type' => 'post',
'comment_count' => 20,
);
$query = new WP_Query( $args );
// 查询评论数量大于等于25的文章
$args = array(
'post_type' => 'post',
'comment_count' => array(
'value' => 25,
'compare' => '>=',
)
);
$query = new WP_Query( $args );
Pagination 分页参数
nopaging(boolean) – 要显示所有文章还是使用分页,默认值false,使用分页posts_per_page(int) – 每页要显示的文章数 (自2.1版开始取代showposts参数). 使用'posts_per_page'=>-1显示所有文章(-1值将忽略offset参数)。使用此参数后如果分页出现偏离请设置paged参数。注意:如果查询是在feed中,wordpress将使用posts_per_rss选项的值替代此参数的值,要重新恢复,尝试使用post_limits钩子或pre_option_posts_per_rss钩子,并返回-1posts_per_archive_page(int) – 在归档页上每页要显示的文章数。在is_archive()或is_search()为true的页面上,优先于posts_per_page的值offset(int) – 要除去或忽略的文章数。警告:设置offset参数会覆盖、忽略paged参数且破坏分页,当使用'posts_per_page'=>-1(显示所有文章)时,忽略offset参数。paged(int) – 页数,显示第x页的文章page(int) – 静态首页要显示第x页的文章ignore_sticky_posts(boolean) – 是否忽略置顶文章 (3.1版开始, 取代caller_get_posts参数)。false(默认):置顶文章将被移入到查询结果的开头;true:不包含置顶文章
示例
// 每页显示3篇文章
$query = new WP_Query( array( 'posts_per_page' => 3 ) );
// 显示全部文章
$query = new WP_Query( array( 'posts_per_page' => -1 ) );
// 通过禁用分页以显示全部文章
$query = new WP_Query( array( 'nopaging' => true ) );
// 从第4篇文章开始显示
$query = new WP_Query( array( 'offset' => 3 ) );
// 从最近3篇文章之后开始显示,每页显示5篇
$query = new WP_Query( array( 'posts_per_page' => 5, 'offset' => 3 ) );
// 显示第x页的文章
$query = new WP_Query( array( 'paged' => 6 ) );
// 显示当前页的文章
$query = new WP_Query( array( 'paged' => get_query_var( 'paged' ) ) );
// 显示当前页的文章,当query变量没有设置(首页)时,设置‘paged’参数为1
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query = new WP_Query( array( 'paged' => $paged ) );
分页提示:使用get_query_var('page'),如果你想要query在页面模板中起作用你需要设置静态首页,query变量page同时也保存那些在内容中包含有<!--nextpage-->标签的单页面分页页码
// 在静态首页显示当前页文章
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$query = new WP_Query( array( 'paged' => $paged ) );
// 显示第一篇置顶文章
$sticky = get_option( 'sticky_posts' );
$query = new WP_Query( array( 'p' => $sticky[0] ) );
// 显示第一篇置顶文章,如果没有,返回最近发布的一篇文章
$args = array(
'posts_per_page' => 1,
'post__in' => get_option( 'sticky_posts' ),
'ignore_sticky_posts' => 1,
);
$query = new WP_Query( $args );
// 显示第一篇置顶文章,如果没有,什么也不返回
$sticky = get_option( 'sticky_posts' );
$args = array(
'posts_per_page' => 1,
'post__in' => $sticky,
'ignore_sticky_posts' => 1,
);
$query = new WP_Query( $args );
if ( $sticky[0] ) {
// insert here your stuff...
}
// 排除所有置顶文章
$query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );
// 排除分类的置顶文章
// 返回分类的所有文章除了置顶文章,其他地方的置顶文章仍然显示
$query = new WP_Query( array( 'ignore_sticky_posts' => 1, 'posts_per_page' => 3, 'cat' => 6 );
// 返回分类的所有文章除了置顶文章,并遵循分页规则
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$sticky = get_option( 'sticky_posts' );
$args = array(
'cat' => 3,
'ignore_sticky_posts' => 1,
'post__not_in' => $sticky,
'paged' => $paged,
);
$query = new WP_Query( $args );
Order & Orderby 排序参数
order(string | array) – 指定数据是升序还是降序,默认DESC。可以用数组设置多种排序方式ASC– 升序,值从最低到最高 (1, 2, 3; a, b, c).DESC– 降序,值从最高到最低 (3, 2, 1; c, b, a).
orderby(string | array) – 排序依据,默认date (post_date),可以传递一个或多个选项none– 没有排序 (2.8版开始)ID– 按ID排序,注意是大写字母author– 按作者排序title– 按标题排序name– 按文章slug排序type– 按文章类型排序 (4.0版开始)date– 按日期排序modified– 按修改日期排序parent– 按父页面/文章的id排序rand– 随机排序comment_count– 按评论数排序(2.9版开始)relevance– 按以下顺序按搜索词排序:第一,整个句子是否匹配。第二,如果所有搜索词都在标题中。第三,如果任意搜索词出现在标题中。第四,如果内容中出现完整的句子。menu_order– 按页面顺序排序。最常用于页面(编辑页面属性框中的排序字段)和附件(插入/上载媒体库对话框中的整数字段),但可用于具有不同menu_order值的任何文章类型(它们都默认为0)。meta_value– 注意查询中必须同时提供meta_key=keyname参数,还要注意,排序将按字母顺序进行,这对于字符串(即单词)是很好的,但对于数字可能会出乎意料(例如,1、3、34、4、56、6等,而不是您自然期望的1、3、4、6、34、56),可使用meta_value_num参数用于数字值的排序。如果要将meta值强制转换为特定类型,还可以指定meta_type,它的值可以是NUMERIC、BINARY、CHAR、DATE、DATETIME、DECIMAL、SIGNED、TIME、UNSIGNED,和$meta_query里的相同。当使用meta_type你同时需要相应的使用meta_value_*。举个例子,当meta_type使用DATETIME,你可以使用meta_value_datetime作为排序依据(以meta值作为日期类型来排序)meta_value_num– meta值以数值类型来排序(2.8版开始支持). 注意查询中必须同时提供meta_key=keyname参数,让meta_value以数字(1、3、4、6、34、56)排序post__in– 按post__in数组提供的id排序(3.5版开始支持)。注意 –order参数不会影响此参数的最终排序结果post_name__in– 按post_name__in数组提供的slug排序(4.6版开始支持)。注意 –order参数不会影响此参数的最终排序结果post_parent__in- 按post_parent__in数组提供的id排序(4.6版开始支持). 注意 –order参数不会影响此参数的最终排序结果
示例
// 以标题的降序排序
$args = array(
'orderby' => 'title',
'order' => 'DESC',
);
$query = new WP_Query( $args );
// 以‘menu_order’和‘title’降序排序
$args = array(
'orderby' => 'menu_order title',
'order' => 'DESC',
);
$query = new WP_Query( $args );
// 随机排序
$args = array(
'orderby' => 'rand',
'posts_per_page' => '1',
);
$query = new WP_Query( $args );
// 按评论统计排序(人气)
$args = array(
'orderby' => 'comment_count'
);
$query = new WP_Query( $args );
// 显示‘Product’类型的文章,按自定义字段‘Price’排序(注意使用meta_value_num)
$args = array(
'post_type' => 'product',
'orderby' => 'meta_value_num',
'meta_key' => 'price',
);
$query = new WP_Query( $args );
// 按‘title’和‘menu_order’排序(title为主)
$args = array(
'post_type' => 'page',
'orderby' => 'title menu_order',
'order' => 'ASC',
);
$query = new WP_Query( $args );
// 按‘title’降序‘menu_order’升序(4.0版开始)
$args = array(
'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' )
);
$query = new WP_Query( $args );
// 多种排序
$args = array(
'orderby' => array( 'meta_value_num' => 'DESC', 'title' => 'ASC' ),
'meta_key' => 'age'
);
$query = new WP_Query( $args );
// 显示自定义文章类型‘my_custom_post_type’,按‘age’排序,用‘meta_query’查询ages为3和4的记录
$args = array(
'post_type' => 'my_custom_post_type',
'meta_key' => 'age',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'age',
'value' => array( 3, 4 ),
'compare' => 'IN',
),
),
);
$query = new WP_Query( $args );
如果要排序两种不同的postmeta(如城市和省份),需要使用meta query联合查询,见下例
$q = new WP_Query( array(
'meta_query' => array(
'relation' => 'AND',
'state_clause' => array(
'key' => 'state',
'value' => 'Wisconsin',
),
'city_clause' => array(
'key' => 'city',
'compare' => 'EXISTS',
),
),
'orderby' => array(
'city_clause' => 'ASC',
'state_clause' => 'DESC',
),
) );
Date 日期参数
year(int) – 四位数年份 (如2011).monthnum(int) – 月数 (从 1 到 12).w(int) – 1年中的某周 (从 0 到 53),取决于start_of_week选项day(int) – 1个月中某天 (从 1 到 31).hour(int) – 小时 (从 0 到 23).minute(int) – 分钟 (从 0 到 60).second(int) – 秒 (0 到 59).m(int) – 年月 (如201307).date_query(array) – 日期参数 (3.7版开始).year(int) – 四位数年份 (如2011).month(int) – 月数 (从 1 到 12).week(int) – 1年中的某周 (从 0 到 53).day(int) – 1个月中某天 (从 1 到 31).hour(int) – 小时 (从 0 到 23).minute(int) – 分钟 (从 0 到 60).second(int) – 秒 (0 到 59).after(string/array) – 检索此日期之后的文章,接受可用于strtotime()的字符串,或year、month、day值的数组:year(string) 接受任何四位数的年份,默认为空month(string) 月份,接受1-12,默认:12.day(string) 日,接受1-31,默认:月份最后1天
before(string/array) – 检索此日期之前的文章,接受可用于strtotime()的字符串,或year、month、day值的数组:year(string) 接受任何四位数的年份,默认为空month(string) 月份,接受1-12,默认:1.day(string) 日,接受1-31,默认:1.
inclusive(boolean) – 对于after/before是否应匹配精确值(精确到时间)compare(string) – 参见WP_Date_Query::get_compare()column(string) – 要查询的列,默认:post_date.relation(string) –OR或AND,如何比较子阵列,默认:AND.
示例
// 返回 2012-12-12 的文章
$query = new WP_Query( 'year=2012&monthnum=12&day=12' );
// 或
$args = array(
'date_query' => array(
array(
'year' => 2012,
'month' => 12,
'day' => 12,
),
),
);
$query = new WP_Query( $args );
// 返回今天的文章
$today = getdate();
$query = new WP_Query( 'year=' . $today['year'] . '&monthnum=' . $today['mon'] . '&day=' . $today['mday'] );
// 或
$today = getdate();
$args = array(
'date_query' => array(
array(
'year' => $today['year'],
'month' => $today['mon'],
'day' => $today['mday'],
),
),
);
$query = new WP_Query( $args );
// 返回本周的文章
$week = date( 'W' );
$year = date( 'Y' );
$query = new WP_Query( 'year=' . $year . '&w=' . $week );
// 或
$args = array(
'date_query' => array(
array(
'year' => date( 'Y' ),
'week' => date( 'W' ),
),
),
);
$query = new WP_Query( $args );
// 返回在工作日上午9点至下午5点之间的文章
$args = array(
'date_query' => array(
array(
'hour' => 9,
'compare' => '>=',
),
array(
'hour' => 17,
'compare' => '<=',
),
array(
'dayofweek' => array( 2, 6 ),
'compare' => 'BETWEEN',
),
),
'posts_per_page' => -1,
);
$query = new WP_Query( $args );
// 返回1月1日至2月28日的文章
$args = array(
'date_query' => array(
array(
'after' => 'January 1st, 2013',
'before' => array(
'year' => 2013,
'month' => 2,
'day' => 28,
),
'inclusive' => true,
),
),
'posts_per_page' => -1,
);
$query = new WP_Query( $args );
请注意,如果在before参数中传递了一个strotime()可用的字符串,并且该字符串仅包含一个日期(不包含时间),则该字符串时间将转换为00:00:00。在这种情况下,即使inclusive设置为true,该日期也不会包含在查询中,如果需要包含,请同时包含时间,例如'before'=>2013-02-28 23:59:59,或者使用数组格式,如果设置了inclusive,则会自动调整数组格式。
// 返回1年前的文章,但在过去一个月有修改
$args = 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,
);
$query = new WP_Query( $args );
date_query查询子句同样可以嵌套使用,构建复制的查询,参考前面章节的“分类法参数”
Post meta 自定义字段参数
这部分的查询参数是由WP_Meta_Query类解析的,因此,如果此参数列表不是最新的,请查看该类的文档。
meta_key(string) – 自定义字段键(key).meta_value(string) – 自定义字段值.meta_value_num(number) – 自定义字段值.meta_compare(string) – 检测meta_value的操作符,值可以是=、!=、>、>=、<、<=、LIKE、NOT LIKE、IN、NOT IN、BETWEEN、NOT BETWEEN、NOT EXISTS、REGEXP、NOT REGEXP、RLIKE,默认值=.meta_query(array) – 自定义字段参数 (3.1版开始).relation(string) – 当存在多个内部meta_query查询数组时,它们之间的逻辑关系,值可以是AND、OR,只有单个meta_query查询数组时不要使用。
meta_query还包含一个或多个具有以下键的数组:
key(string) – 自定义字段键(key).value(string|array) – 自定义字段值,只有当compare是IN、NOT IN、BETWEEN或NOT BETWEEN时,它可以是一个数组,在WordPress 3.9及更高版本中使用EXISTS或NOT EXISTS比较时,不必指定值。compare(string) – 检测value的操作符,值可以是=、!=、>、>=、<、<=、LIKE、NOT LIKE、IN、NOT IN、BETWEEN、NOT BETWEEN、NOT EXISTS、REGEXP、NOT REGEXP、RLIKE,默认值=type(string) – 自定义字段类型,值可以是NUMERIC、BINARY、CHAR、DATE、DATETIME、DECIMAL、SIGNED、TIME、UNSIGNED,默认值CHAR.
只有日期以YYYY-MM-DD格式存储的情况下,type值为DATE同时compare值为BETWEEN的测试才能有效,且以该格式进行测试。
重要提示:meta_query查询是由1个或多个内部meta_query查询数组所组成的数组 - 您可以在下面的示例中看到这一点。
这样的结构允许你同时查询多个自定义字段数据,通过relation参数来描述它们之间的逻辑关系,值可以是AND、OR,默认值为AND。
// 显示自定义字段键名为‘color’的文章,不管字段值是什么
$query = new WP_Query( array( 'meta_key' => 'color' ) );
// 显示自定义字段值为‘blue’的文章,不管字段键名是什么
$query = new WP_Query( array( 'meta_value' => 'blue' ) );
// 同上
$args = array(
'meta_value' => 'blue',
'post_type' => 'page'
);
$query = new WP_Query( $args );
// 显示自定义字段键名为‘color’,且自定义字段值为‘blue’的文章
$args = array(
'meta_key' => 'color',
'meta_value' => 'blue'
);
$query = new WP_Query( $args );
// 显示自定义字段键名为‘color’,且自定义字段值不是‘blue’的文章
$args = array(
'meta_key' => 'color',
'meta_value' => 'blue',
'meta_compare' => '!='
);
$query = new WP_Query( $args );
// 显示自定义字段键为一个设置日期且自定义字段值为“现在”的文章。仅显示日期未超过的文章。
$args = array(
'post_type' => 'event',
'meta_key' => 'event_date',
'meta_value' => date( "Ymd" ), // change to how "event date" is stored
'meta_compare' => '>',
);
$query = new WP_Query( $args );
// 显示自定义字段键为‘price’且自定义字段值小于或等于22的‘product'(s)的文章
// 通过使用“meta_value”参数,值99将被视为大于100,因为数据存储为“字符串”,而不是“数字”。对于数字比较,请使用“meta_value_num”。
$args = array(
'meta_key' => 'price',
'meta_value' => '22',
'meta_compare' => '<=',
'post_type' => 'product'
);
$query = new WP_Query( $args );
// 显示自定义字段值为(0)的文章,不管字段键名是什么
$args = array(
'meta_value' => '_wp_zero_value'
);
$query = new WP_Query( $args );
// 使用meta_query只查询1个自定义字段
// 注意:meta_query查询必须是数组,即使只查询1个字段
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
),
),
);
$query = new WP_Query( $args );
// 查询多个自定义字段
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
);
$query = new WP_Query( $args );
// 查询多个自定义字段,字段之间的逻辑关系为'OR'
// 显示键名为‘color’,值NOT LIKE ‘blue’,或键名为‘price’,值在20到100之间的文章
$args = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE',
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN',
),
),
);
$query = new WP_Query( $args );
// 可以嵌套‘meta_query’子句以构造复杂的查询
$args = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'color',
'value' => 'orange',
'compare' => '=',
),
array(
'relation' => 'AND',
array(
'key' => 'color',
'value' => 'red',
'compare' => '=',
),
array(
'key' => 'size',
'value' => 'small',
'compare' => '=',
),
),
),
);
$query = new WP_Query( $args );
Permission 权限参数
根据用户具备的能力(权限)查询文章
perm(string) – 用户权限
示例
// 如果用户拥有“readable”的能力,显示“发布”和“私密”状态的文章
$args = array(
'post_status' => array( 'publish', 'private' ),
'perm' => 'readable',
);
$query = new WP_Query( $args );
Mime 类型参数
与附件post类型一起使用
post_mime_type(string/array) – 允许的mime类型
示例
获取gif图像,请记住,默认情况下,附件的post_status是inherit。
$args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'post_mime_type' => 'image/gif',
);
$query = new WP_Query( $args );
要排除某些mime类型,首先需要使用get_allowed_mime_types()获取所有mime类型,并使用array_diff()在所需的数组和允许的mime类型之间取得差异。
$unsupported_mimes = array( 'image/jpeg', 'image/gif', 'image/png', 'image/bmp', 'image/tiff', 'image/x-icon' );
$all_mimes = get_allowed_mime_types();
$accepted_mimes = array_diff( $all_mimes, $unsupported_mimes );
$args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'post_mime_type' => $accepted_mimes,
);
$query = new WP_Query( $query_args );
缓存参数
停止将检索到的数据添加到缓存
cache_results(boolean) – 文章缓存.update_post_meta_cache(boolean) – 文章meta缓存.update_post_term_cache(boolean) – 文章term缓存.
示例
// 查询文章,文章的数据不缓存
$args = array(
'posts_per_page' => 50,
'cache_results' => false
);
$query = new WP_Query( $args );
// 文章的meta数据不缓存(文章的自定义字段)
$args = array(
'posts_per_page' => 50,
'update_post_meta_cache' => false
);
$query = new WP_Query( $args );
// 文章的term数据不缓存(文章的分类、标签、自定义分类等)
$args = array(
'posts_per_page' => 50,
'update_post_term_cache' => false
);
$query = new WP_Query( $args );
在一般情况下,您不需要使用这些,添加到缓存是正确的做法,但是它们在特定情况下可能有用。这种情况的一个例子可能是,使用WP_Query检索要显示的文章标题和url列表,但不使用关于文章的其他信息,也不需要分类数据(term)和元数据(meta)。通过不加载此信息,可以节省额外的不必要SQL查询的时间。
注意:如果使用持久对象缓存后端(如memcached),则默认情况下,这些标志设置为false,因为当存在持久缓存时,无需在每次页面加载时更新缓存。
返回字段参数
fields(string) – 返回哪些字段,有三种选择:all– 返回所有字段 (默认).ids– 返回post id的一个数组.id=>parent– 返回具有ID和post_parent属性的stdClass对象数组
传递任何其他内容都将返回所有字段(默认值)—— 一个post对象数组。