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

wp_redirect触发无限循环求助:已尝试template_redirect与init钩子

解决wp_redirect无限循环问题

你的代码出现无限循环的核心原因很明确:当未登录用户访问你的登录页面时,template_redirect钩子依然会触发,此时!is_user_logged_in()条件成立,代码又会把用户重定向回登录页面,形成死循环。

要解决这个问题,只需要在重定向逻辑中排除登录页面本身,让重定向规则不在登录页执行即可。下面给你几种可行的解决方案:

方案一:通过页面Slug排除(适合自定义登录页)

如果你的登录页是一个自定义页面,Slug为login(即URL是http://localhost/lawyer_portal/login/),可以用is_page()函数直接判断当前页面是否为登录页:

add_action( 'template_redirect', 'redirect_to_specific_page' );
function redirect_to_specific_page() {
    // 若当前是登录页,直接返回,不执行重定向
    if ( is_page( 'login' ) ) {
        return;
    }

    // 未登录且非登录页时,跳转到登录页
    if ( !is_user_logged_in() ) {
        // 用home_url替代硬编码URL,适配站点域名变化
        wp_redirect( home_url( '/lawyer_portal/login/' ) );
        exit; // 必须添加,终止后续代码执行,确保重定向生效
    }
}

方案二:通过URL路径对比(更通用)

如果不确定页面Slug,或者想更灵活地匹配登录URL,可以直接对比当前请求的路径和登录页路径:

add_action( 'template_redirect', 'redirect_to_specific_page' );
function redirect_to_specific_page() {
    $login_url = home_url( '/lawyer_portal/login/' );
    // 解析登录URL的路径部分,和当前请求URI对比
    $login_path = parse_url( $login_url, PHP_URL_PATH );
    
    if ( $_SERVER['REQUEST_URI'] === $login_path ) {
        return;
    }

    if ( !is_user_logged_in() ) {
        wp_redirect( $login_url );
        exit;
    }
}

方案三:针对WordPress默认登录页

如果你用的是WordPress自带的wp-login.php登录页,可以用专门的is_wp_login()函数判断,代码更简洁:

add_action( 'template_redirect', 'redirect_to_specific_page' );
function redirect_to_specific_page() {
    // 排除默认登录页
    if ( is_wp_login() ) {
        return;
    }

    if ( !is_user_logged_in() ) {
        // 直接调用wp_login_url()获取默认登录地址
        wp_redirect( wp_login_url() );
        exit;
    }
}

额外注意事项

  • 永远不要省略exit或wp_die():这两个函数会终止PHP脚本的后续执行,确保重定向能正常生效,避免出现意外问题。
  • 优先使用home_url()或wp_login_url():避免硬编码站点URL,这样当你更换域名或迁移站点时,不需要修改代码。

内容的提问来源于stack exchange,提问作者Shadow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:32:31