在 WordPress 主题开发中,我们经常需要修改文章列表的查询方式,比如:
- 隐藏某些分类的文章
- 按自定义字段排序
- 让特定的文章类型出现在主查询(Main Query)中
WordPress 提供了 pre_get_posts 这个钩子,允许我们在正式查询数据库之前修改查询参数,实现更加灵活的定制。
今天,我们就来看看如何使用 pre_get_posts 来优化你的 WordPress 主题。
基础用法:在主页隐藏某个分类的文章
假设我们不希望在网站首页显示某个 ID 为 10 的分类的文章,可以使用 pre_get_posts 进行过滤:
function exclude_category_from_home( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-10' ); // 负号表示排除该分类
}
}
add_action( 'pre_get_posts', 'exclude_category_from_home' );
代码解析:
is_home():确保修改的是首页查询。is_main_query():避免影响后台或小工具等二次查询。$query->set( 'cat', '-10' ):排除分类 ID 为10的文章。
进阶用法:在自定义分类页面按浏览量排序
如果我们有一个自定义字段 views_count 存储文章浏览量,并希望在分类页面按照浏览量降序排列,我们可以这样做:
function order_posts_by_views( $query ) {
if ( $query->is_category() && $query->is_main_query() ) {
$query->set( 'meta_key', 'views_count' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'DESC' );
}
}
add_action( 'pre_get_posts', 'order_posts_by_views' );
代码解析:
is_category():只在分类页面生效。meta_key和orderby:按照views_count自定义字段排序。order => DESC:浏览量高的文章排在前面。
扩展应用:在主查询中添加自定义文章类型
默认情况下,WordPress 主页只显示 post 文章类型。如果你希望在主页同时展示自定义文章类型(比如 portfolio),可以这样做:
function add_custom_post_type_to_main_query( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'post_type', array( 'post', 'portfolio' ) );
}
}
add_action( 'pre_get_posts', 'add_custom_post_type_to_main_query' );
这样,你的首页就可以同时显示普通文章(post)和作品集(portfolio)了!
总结
pre_get_posts 是 WordPress 主题开发中最常用的查询优化钩子。
通过 set() 方法,我们可以修改查询参数,隐藏分类、调整排序、添加自定义文章类型等。
只在 is_main_query() 时修改,避免影响后台或小工具等二次查询。
学会了这个技巧,你的 WordPress 主题开发将会更加灵活!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








