You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:35:21