在 WordPress 开发中,WP_Query 是构建自定义查询的核心类。本文将通过一个具体示例,详细说明如何查询自定义文章类型(Custom Post Type)下特定自定义分类法(Custom Taxonomy)中的文章,并附上完整的参数参考。
示例:查询自定义分类下的热门电影
假设我们有一个自定义文章类型 movie(电影),以及一个自定义分类法 areas(地区)。我们希望查询“地区”分类下别名为 red 和 blue 的、按浏览量(自定义字段 views)升序排列的电影。
<?php
$args = array(
'post_type' => 'movie', // 指定查询的电影类型
'meta_key' => 'views', // 按自定义字段“views”排序
'orderby' => 'meta_value_num', // 按数值排序
'order' => 'ASC', // 升序排列
'tax_query' => array( // 分类法查询参数
array(
'taxonomy' => 'areas', // 自定义分类法:地区
'field' => 'slug', // 使用分类别名进行匹配
'terms' => array( 'red', 'blue' ), // 指定要查询的地区别名
'include_children' => true, // 包含子分类
'operator' => 'IN' // 匹配 red 或 blue 中的任意一个
),
),
);
$query = new WP_Query( $args );
// 开始循环输出
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// 在这里输出每部电影的内容,例如:the_title();
}
}
// 重置文章数据,避免影响主循环
wp_reset_postdata();
?>
关键参数解析
- post_type: 指定要查询的文章类型,这里是自定义的
movie。 - tax_query: 用于构建分类法查询的多维数组。
- taxonomy: 指定要查询的自定义分类法名称。
- field: 指定如何匹配分类项,常用
slug(别名)或id(ID)。 - terms: 要匹配的分类项,可以是别名、ID 或其数组。
- operator: 匹配操作符,
IN表示匹配数组中的任意项。
- meta_key 与 orderby: 结合使用可按自定义字段排序。
meta_value_num确保按数值而非字符串排序。
WP_Query 完整参数参考
以下整理了 WP_Query 中常用的核心参数,方便开发者查阅。
基础参数
- 作者参数:
author,author_name - 分类与标签参数:
cat,category_name,tag,tag_id等。 - 文章与页面参数:
p(ID),name(别名),post__in,post__not_in。
文章类型与状态
'post_type' => array('post', 'page', 'movie'), // 可查询多种类型
'post_status' => array('publish', 'pending', 'draft'), // 可指定多种状态
// 使用 'any' 可查询所有(非排除的)类型或状态
'post_type' => 'any',
'post_status' => 'any',
分页与排序
- 分页:
posts_per_page,paged,nopaging。 - 排序:
order(ASC/DESC),orderby(date, title, meta_value, rand 等)。
自定义字段(元数据)查询
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => '=', // 可选:=, !=, >, >=, <, <=, LIKE, IN, BETWEEN 等
'type' => 'CHAR' // 可选:NUMERIC, BINARY, CHAR, DATE, DECIMAL 等
)
)
时间参数
可按年、月、周、日、时、分、秒进行查询:year, monthnum, w, day, hour, minute, second。
性能与缓存
- no_found_rows: 设为
true可禁用分页计数以提升性能,但分页将失效。 - cache_results, update_post_term_cache, update_post_meta_cache: 通常保持为
true以利用缓存。
最佳实践与注意事项
- 重置查询: 使用自定义
WP_Query后,务必调用wp_reset_postdata()来恢复主循环的全局变量。 - 参数冲突: 避免同时使用互斥的参数,如
post__in和post__not_in。 - 性能优化: 对于复杂的
meta_query或tax_query - 版本适配: 本文所述参数适用于 WordPress 3.1 及更高版本,部分参数(如
tax_query)在旧版本中不可用。
通过灵活组合这些参数,你可以构建出几乎任何需要的文章查询,为你的 WordPress 主题或插件提供强大的数据展示能力。