在 WordPress 开发中,WP_Query 是最常用也最强大的查询类。
无论是自定义文章列表、筛选特定分类的文章、还是创建复杂的搜索功能,WP_Query 都是必不可少的工具。
本文将系统讲解 WP_Query 的所有主要参数、常见用法与性能优化技巧,让你彻底掌握 WordPress 自定义查询的精髓。
一、WP_Query 是什么?
WP_Query 是 WordPress 的核心查询类,用于根据指定条件从数据库中获取文章(post)、页面(page)、自定义文章类型(custom post type)等内容。
默认情况下,WordPress 会根据 URL 自动创建查询对象(例如首页、分类页、单页等),但通过 WP_Query,你可以完全自定义查询条件。
二、WP_Query 的基本语法
$args = array(
'post_type' => 'post', // 查询类型:文章、页面或自定义文章类型
'posts_per_page' => 10, // 每页显示数量
'orderby' => 'date', // 排序字段
'order' => 'DESC', // 排序方式
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
the_title('<h2>', '</h2>');
the_excerpt();
endwhile;
endif;
wp_reset_postdata();
三、WP_Query 常用参数分类总览
| 参数类型 | 常见参数 | 说明 |
|---|---|---|
| 基本参数 | post_type, post_status, posts_per_page, paged | 控制查询内容类型与分页 |
| 分类参数 | cat, category_name, category__in | 查询指定分类的文章 |
| 标签参数 | tag, tag_id, tag_slug__in | 查询标签相关文章 |
| 自定义分类法 | tax_query | 多层分类法组合查询 |
| 自定义字段 | meta_query, meta_key, meta_value | 根据文章的自定义字段筛选 |
| 排序参数 | orderby, order | 按时间、标题、meta 值等排序 |
| 作者参数 | author, author_name | 查询特定作者的文章 |
| 搜索参数 | s | 实现关键词搜索 |
| 日期参数 | year, monthnum, day, date_query | 按日期筛选文章 |
| 其他参数 | post__in, post__not_in, ignore_sticky_posts | 控制特定文章包含或排除 |
四、核心参数详解
1. post_type(查询内容类型)
'post_type' => array('post', 'page', 'product')
- 默认:
post - 可选值:
page、attachment、自定义类型(如product) - 数组形式可同时查询多个类型。
2. posts_per_page(每页数量)
'posts_per_page' => 5
- 默认:在后台设置 → 阅读中定义的文章数量。
- 特殊值:
-1表示不分页,获取所有结果。
3. orderby 与 order(排序)
'orderby' => 'date',
'order' => 'DESC'
常用排序字段:
| 字段 | 说明 |
|---|---|
date | 按发布时间 |
title | 按标题字母顺序 |
rand | 随机排序 |
comment_count | 按评论数 |
meta_value | 按自定义字段值排序(需配合 meta_key) |
4. category 查询(按分类筛选)
'cat' => 12,
'category__in' => array(3, 5, 9)
cat: 分类 IDcategory_name: 分类别名(slug)category__not_in: 排除某些分类
5. tag 查询(按标签筛选)
'tag' => 'wordpress'
或
'tag__in' => array(4, 8)
6. tax_query(自定义分类法查询)
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('seo', 'optimization'),
'operator' => 'IN',
),
),
💡 可实现多层 AND / OR 查询逻辑:
'relation' => 'AND'
7. meta_query(按自定义字段查询)
'meta_query' => array(
array(
'key' => 'price',
'value' => 100,
'compare' => '>',
'type' => 'NUMERIC'
),
)
常见比较符号:=, !=, >, <, >=, <=, LIKE, NOT LIKE, IN, NOT IN
8. date_query(按时间筛选)
'date_query' => array(
array(
'after' => '2024-01-01',
'before' => '2024-12-31',
'inclusive' => true,
),
)
9. post__in / post__not_in(特定文章)
'post__in' => array(12, 45, 78),
'post__not_in' => array(3, 4)
💡 常用于首页推荐、相关内容、置顶过滤。
五、分页参数
'paged' => get_query_var('paged') ? get_query_var('paged') : 1,
搭配 paginate_links() 可以实现完整分页。
六、性能优化建议
- 避免使用
posts_per_page=-1查询大量数据
可使用分页或fields => 'ids'仅获取 ID。 - 开启缓存(Transient 或 Object Cache)
缓存 WP_Query 结果减少数据库查询次数。 - 适当添加数据库索引
对经常查询的 meta_key 或 taxonomy term 建立索引提升性能。
七、实用示例合集
📌 获取指定分类最新文章
$query = new WP_Query(array(
'cat' => 3,
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC'
));
📌 获取价格高于 100 的产品
$query = new WP_Query(array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'price',
'value' => 100,
'compare' => '>',
'type' => 'NUMERIC'
)
)
));
📌 随机显示一篇文章
$query = new WP_Query(array(
'orderby' => 'rand',
'posts_per_page' => 1
));
八、总结
WP_Query 是 WordPress 最灵活的查询类,几乎所有前端数据展示都离不开它。
熟练掌握其参数与组合方式,可以让你实现几乎任何自定义内容结构,从简单的博客列表到复杂的电商筛选系统。