在 WordPress 中,使用 WP_Query
进行文章查询是最常见的操作,学习好这方面的操作, WordPress 开发基本就学会了一半。
「WordPress果酱」将通过一系列教程讲解如何使用 WP_Query
进行 WordPress 文章查询。
我写这一系列文章的目的也是为了方便自己使用这些参数的时候方便查询,所以如果你也是经常进行 WordPress 二次开发的话,建议收藏本文。
第一讲,把 WP_Query
最常用的分类,标签和分类模的所有相关的参数讲解一下,例子也是来自官方文档,学完之后,你可以在 WordPress 进行非常复杂的多重筛选。
一、分类参数
分类有以下 5 个参数:
- cat (int) – 使用分类 ID。
- category_name (string) – 使用分类别名
- category__and (array) – 使用分类 ID 数组。
- category__in (array) – 使用分类 ID 数组。
- category__not_in (array) – 使用分类 ID 数组。
使用分类 ID 获取含有某个分类(以及该分类下的所有子分类)的文章:
代码语言:javascript复制$query = new WP_Query( array( 'cat' => 4 ) );
使用分类别名获取含有某个分类(以及该分类下的所有子分类)的文章:
代码语言:javascript复制$query = new WP_Query( array( 'category_name' => 'php' ) );
使用分类 ID 获取含有某个分类(不含该分类下的所有子分类)的文章:
代码语言:javascript复制$query = new WP_Query( array( 'category__in' => 4 ) );
使用分类 ID 获取含有几个分类(只要含有一个)的文章:
代码语言:javascript复制$query = new WP_Query( array( 'cat' => '2,6,17,38' ) );
使用分类别名获取含有几个分类(只要含有一个)的文章:
代码语言:javascript复制$query = new WP_Query( array( 'category_name' => 'staff,news' ) );
使用分类别名获取含有几个分类(都含)的文章:
代码语言:javascript复制$query = new WP_Query( array( 'category_name' => 'staff news' ) );
使用分类 ID 获取不含有几个分类的文章,在 ID 前面加上-号:
代码语言:javascript复制$query = new WP_Query( array( 'cat' => '-12,-34,-56' ) );
使用分类 ID 获取同时含有几个分类的文章:
代码语言:javascript复制$query = new WP_Query( array( 'category__and' => array( 2, 6 ) ) );
使用分类 ID 获取含有几个分类(只要含有一个)的文章(注意这些分类的子分类单独关联的文章不会获取):
代码语言:javascript复制$query = new WP_Query( array( 'category__in' => array( 2, 6 ) ) );
使用分类 ID 获取不含有几个分类的文章:
代码语言:javascript复制$query = new WP_Query( array( 'category__not_in' => array( 2, 6 ) ) );
二、标签参数
有以下 7 个参数:
- tag (string) – 使用标签别名。
- tag_id (int) – 使用标签 ID。
- tag__and (array) – 使用标签 ID 数组。
- tag__in (array) – 使用标签 ID 数组。
- tag__not_in (array) – 使用标签 ID 数组。
- tag_slug__and (array) – 使用标签别名。
- tag_slug__in (array) – 使用标签别名。
使用标签别名获取含有某个标签的文章:
代码语言:javascript复制$query = new WP_Query( array( 'tag' => 'cooking' ) );
使用标签 ID 获取含有某个标签的文章:
代码语言:javascript复制$query = new WP_Query( array( 'tag_id' => 13 ) );
使用标签别名获取含有某几个标签的文章:
代码语言:javascript复制$query = new WP_Query( array( 'tag' => 'bread,baking' ) );
使用标签别名获取都含有某几个标签的文章:
代码语言:javascript复制$query = new WP_Query( array( 'tag' => 'bread baking recipe' ) );
使用标签 ID 获取都打了标签 ID 为 37 和 47 的文章:
代码语言:javascript复制$query = new WP_Query( array( 'tag__and' => array( 37, 47 ) ) );
使用标签 ID 获取只要打了标签 ID 为 37 或 47 的文章:
代码语言:javascript复制$query = new WP_Query( array( 'tag__in' => array( 37, 47 ) ) );
使用标签 ID 获取都没有打了标签 ID 为 37 或 47 的文章:
代码语言:javascript复制$query = new WP_Query( array( 'tag__not_in' => array( 37, 47 ) ) );
tag_slug__in
和 tag_slug__and
参数和对应的 tag__in
和 tag__and
, 一样,只是它们不使用标签 ID,而是用标签别名。
三、真正的王炸:tax_query
tax_query 参数是 WordPress 3.1 版本引进的,WordPress 非常复杂的多重筛选就是使用它实现的,我们将通过几个例子讲解怎么实现。
特别注意的是:tax_query
参数是分类模式参数数组的列表,首先我们先了解一下它的参数数组的子参数:
- relation (string) – 多个内部分类参数数组之间的逻辑关系。 可能的值为「AND」,「OR」,如果只有一个分类参数数组,不要使用。
- taxonomy (string) – 分类模式.
- field (string) – 如何获取分类模式(Taxonomy term),可能的值有:「term_id」,「name」,「slug」或者「term_taxonomy_id」,默认是「term_id」。
- terms (int/string/array) – Taxonomy term(s),和 field 参数对应,上面制定了字段,这里则指定对应的值。
- include_children (boolean) – 对于层级的分类模式,这个参数用于控制是否包含子分类,默认是包含。
- operator (string) – 用于比较的参数. 可能的值有:「IN」,「NOT IN」,「AND」「EXISTS」和「NOT EXISTS」,默认是「IN」。
单个分类模式查询
在 people
这个自定义分类模式获取值为 bob
的文章:
$query = new WP_Query(array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => 'people',
'field' => 'slug',
'terms' => 'bob',
),
),
));
多重分类模式查询
从多个分类模式下获取文章:movie_genre
(电影分类)为 action
(动作片),comedy
(喜剧片)并且 actor
(演员)ID不是 103, 115, 206
的电影。
$query = new WP_Query(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',
),
),
));
获取在 quotes
分类中的文章或者有 quote
文章格式的文章:
$query = new WP_Query(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' ),
),
),
));
嵌套分类模式查询
tax_query
参数支持嵌套,可以用来创建更加复杂的查询。
比如:获取在 quotes
分类中或者同时有 quote
文章格式和在 wisdom
分类中的文章:
$query = new WP_Query(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' ),
),
),
),
));