描述
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) – 作者id
author_name
(string) – 使用user_nicename
author__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) – 分类id
category_name
(string) – 分类slug
category__and
(array) – 分类id
category__in
(array) – 分类id
category__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) – 标签slug
tag_id
(int) – 标签id
tag__and
(array) – 标签id
tag__in
(array) – 标签id
tag__not_in
(array) – 标签id
tag_slug__and
(array) – 标签slug
tag_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_id
terms
(int/string/array) – 分类法项目(terms)include_children
(boolean) – 对有分级的taxonomies是否包含其子级,默认为true
operator
(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) – 文章id
name
(string) – 文章slug
page_id
(int) – 页面id
pagename
(string) – 页面slug
post_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_posts
post__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
钩子,并返回-1
posts_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对象数组。