
本文档旨在指导 WordPress 开发者如何使用 pre_get_posts 钩子修改查询,以便在特定页面上显示待审状态的帖子,而不是默认的已发布帖子。我们将深入探讨如何正确使用该钩子,并提供可行的代码示例,帮助你实现自定义的帖子状态显示需求。
使用 pre_get_posts 钩子修改帖子状态
pre_get_posts 是一个强大的 WordPress 钩子,允许你在 WordPress 执行主查询之前修改查询参数。这对于自定义帖子显示、排序和过滤等操作非常有用。
代码示例
以下代码演示了如何使用 pre_get_posts 钩子来修改指定页面的帖子状态,使其显示待审帖子:
将一个或多个 UI 原型图、线框图、产品截图或设计稿转换为标准化、可直接交付的 PRD 风格文档,供产品、设计、前端和测试共同使用。适用于 Codex 需要分析 PC 网页、桌面端、移动端、响应式页面、独立弹窗、表单、表格、看板、数据大屏或多页面流程截图,还原页面结构与交互,强制套用固定文档模板,抽取跨页面共享规则,或把一组原型沉淀为单页规范文档加整体业务流程文档的场景。不适用于纯视觉审美点评、代码实现、接口设计、埋点方案、竞品分析或无 UI 输入的业务需求创作。
function custom_pre_get_posts( $query ) {
// 仅在前端且不是后台管理页面时执行
if ( ! is_admin() && $query->is_main_query() ) {
// 检查当前页面是否为目标页面,并验证用户权限
if( get_query_var('pagename') == 'name_of_the_page' && current_user_can('publish_posts') ) {
// 修改帖子状态为 'pending'
$query->set( 'post_status', 'pending' );
}
}
}
add_action( 'pre_get_posts', 'custom_pre_get_posts' );代码解释:
- custom_pre_get_posts( $query ) 函数: 这是我们的钩子函数,它接收 $query 对象作为参数。$query 对象包含了当前查询的所有参数。
- ! is_admin() && $query->is_main_query() 条件: 这个条件确保我们的代码只在前端页面且是主查询时执行。is_admin() 函数检查当前是否为后台管理页面,$query->is_main_query() 检查当前是否为主查询。避免在后台或非主查询中意外修改查询。
- get_query_var('pagename') == 'name_of_the_page' && current_user_can('publish_posts') 条件: 这个条件用于判断当前页面是否为目标页面(name_of_the_page 需要替换成你实际的页面名称),并且当前用户是否具有 publish_posts 权限。只有当两个条件都满足时,才会修改帖子状态。
- $query->set( 'post_status', 'pending' ): 这行代码使用 $query 对象的 set() 方法来修改 post_status 参数,将其设置为 pending,即待审状态。
- add_action( 'pre_get_posts', 'custom_pre_get_posts' ): 这行代码将我们的 custom_pre_get_posts 函数挂载到 pre_get_posts 钩子上,以便在 WordPress 执行查询之前执行我们的函数。
注意事项
- 替换 name_of_the_page: 务必将代码中的 name_of_the_page 替换成你想要显示待审帖子的实际页面名称。
- 用户权限验证: current_user_can('publish_posts') 用于验证用户是否具有发布帖子的权限。你可以根据实际需求修改权限验证的条件。
- 避免影响其他查询: ! is_admin() && $query->is_main_query() 这个条件非常重要,它可以避免你的代码影响到后台管理页面或其他非主查询,确保只有目标页面才会显示待审帖子。
- 调试技巧: 如果代码没有生效,可以使用 var_dump($query) 或 print_r($query) 在代码中打印 $query 对象,查看查询参数是否正确修改。
总结
通过使用 pre_get_posts 钩子,我们可以灵活地修改 WordPress 的查询参数,实现自定义的帖子显示需求。在修改查询参数时,务必注意添加适当的条件判断,避免影响到其他页面或功能。希望本文档能够帮助你成功地在 WordPress 中显示待审帖子。

















