在 WordPress 中修改默认登录入口是常见需求,但不少人用 wp_redirect 直接跳转 wp-login.php 后,页面会在两个地址之间无限来回,这就是典型的重定向循环。理解 WordPress 的加载流程和钩子时机,才能干净地解决这个问题。

为什么会出现循环跳转
循环跳转的本质是:每次访问默认登录页时,代码都执行一次跳转;而跳转的目标地址又被规则判定为需要再次跳转,如此反复。常见错误如下:
- 在模板文件里用 header 跳转,没有排除自身页面
- 使用 init 钩子无差别重定向,连重定向后的地址也命中规则
- 把 AJAX 和 POST 登录请求也一并拦截,导致表单无法提交
使用 login_init 拦截默认登录页
login_init 是 WordPress 在进入登录逻辑前触发的钩子,适合在此判断并跳转,且不会影响其他后台接口。
// 重定向默认登录页到自定义页面
add_action('login_init', function () {
// 当前已经是自定义登录页则不处理
if (isset($_SERVER['REQUEST_URI']) && strpos($_SERVER['REQUEST_URI'], 'my-login') !== false) {
return;
}
// 避免 POST 登录请求被拦截
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
return;
}
wp_redirect(home_url('/my-login/'));
exit;
});
用 login_redirect 控制登录后去向
如果用户从自定义页登录成功,可以用 login_redirect 决定跳回位置,避免又被送回默认页。
// 登录后跳转到首页而不是默认后台
add_filter('login_redirect', function ($redirect_to, $request, $user) {
if (isset($user->roles) && in_array('administrator', $user->roles)) {
return admin_url();
}
return home_url();
}, 10, 3);
注意事项
排除关键请求
必须排除 POST 登录、XML-RPC 以及 REST 鉴权请求,否则手机端 App 或区块编辑器会失效。
缓存插件冲突
部分缓存插件会缓存 302 响应,上线前应在无缓存环境下测试,或对被重定向的地址设置不缓存规则。
核心原则:重定向代码只认“默认登录入口”,不认“所有含 login 的地址”,就能避开循环。
小结
正确重定向 WordPress 默认登录页的关键是选对钩子、判断当前页面、放行正常登录请求。按上述方式处理,既可以把用户引到自定义页,也不会陷入循环跳转。
WordPresslogin_redirectredirect_loop修改时间:2026-07-27 12:33:22