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
相关产品推荐
相关产品推荐

