WordPress:草稿状态Personnel文章重定向仅对登录用户生效,如何修复?
解决自定义文章类型草稿状态文章的全局重定向问题
原来的代码仅对登录用户生效,核心原因是:未登录用户访问草稿状态的文章时,WordPress会直接拦截请求并返回404,不会初始化全局$post对象,导致你的条件判断$post->post_status == 'draft'根本无法触发。
以下是两种可靠的解决方案,均能覆盖所有用户(无论是否登录):
方案一:使用parse_request钩子(推荐)
这个钩子在WordPress解析请求的早期阶段触发,能绕过默认的未登录用户草稿访问限制,直接获取请求的文章信息:
add_action( 'parse_request', 'inactive_personnel_redirect' ); function inactive_personnel_redirect( $wp ) { // 验证是否是Personnel类型的单文章请求 if ( isset( $wp->query_vars['post_type'] ) && $wp->query_vars['post_type'] === 'personnel' && isset( $wp->query_vars['p'] ) ) { $post_id = absint( $wp->query_vars['p'] ); $post = get_post( $post_id ); // 确认文章存在且状态为草稿 if ( $post && $post->post_status === 'draft' ) { // 302为临时重定向,若文章永久不发布可改为301 wp_redirect( home_url( '/about-us/inactive' ), 302 ); exit; } } }
方案二:使用pre_handle_404钩子
在WordPress准备返回404页面之前做检查,适合需要统一处理404场景的情况:
add_action( 'pre_handle_404', 'check_draft_personnel_redirect', 10, 2 ); function check_draft_personnel_redirect( $wp_query, $wp ) { if ( isset( $wp->query_vars['post_type'] ) && $wp->query_vars['post_type'] === 'personnel' && isset( $wp->query_vars['p'] ) ) { $post_id = absint( $wp->query_vars['p'] ); $post = get_post( $post_id ); if ( $post && $post->post_status === 'draft' ) { wp_redirect( home_url( '/about-us/inactive' ), 302 ); exit; } } return false; // 非草稿情况,让WordPress继续处理404 }
关键注意事项
- 重定向状态码选择:如果草稿是临时待发布状态,优先用
302临时重定向,避免浏览器缓存错误的重定向规则;若该文章永久不会发布,再使用301永久重定向。 - 目标页面准备:确保
/about-us/inactive页面存在,且包含友好提示内容(比如“该人员信息暂未发布,敬请关注”),提升用户体验。 - 清理旧代码:替换之前添加的
template_redirect钩子代码,避免逻辑冲突。
内容的提问来源于stack exchange,提问作者nickpish
相关产品推荐
相关产品推荐

