
本文档旨在指导 WordPress 开发者如何使用 pre_get_posts 钩子修改查询,以便在特定页面上显示待审状态的帖子,而不是默认的已发布帖子。我们将深入探讨如何正确使用该钩子,并提供可行的代码示例,帮助你实现自定义的帖子状态显示需求。
使用 pre_get_posts 钩子修改帖子状态
pre_get_posts 是一个强大的 WordPress 钩子,允许你在 WordPress 执行主查询之前修改查询参数。这对于自定义帖子显示、排序和过滤等操作非常有用。
代码示例
以下代码演示了如何使用 pre_get_posts 钩子来修改指定页面的帖子状态,使其显示待审帖子:
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 中显示待审帖子。










