12年专注,只做WordPress定制开发一件事

搜索
登录/注册

使用 pre_get_posts 自定义 WordPress主题文章查询

王超
2025-04-01
WordPress主题开发
13 次

在 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_keyorderby:按照 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 主题开发将会更加灵活!🎯

文章标签:

WordPress主题开发业务联系方式

WordPress日记主要承接WordPress主题定制开发PSD转WordPressWordPress仿站以及以WordPress为管理后端的小程序、APP,我们一直秉持“做一个项目,交一个朋友”的理念,希望您是我们下一个朋友。如果您有WordPress主题开发需求,可随时联系QQ:919985494 微信:18539976310

搜索

在线客服
嘿,有问题找我来帮您!