WordPress:访问wp-login.php等页面时重定向至带#login的上一页
解决方案
1. 替换正确的Hook
你之前使用的admin_init仅针对后台管理页面初始化,对wp-login.php这类登录相关页面不生效,应该改用login_init钩子——它会在登录、注册、找回密码页面加载时触发,精准覆盖你的需求场景。
2. 安全获取来源页并构造跳转链接
用WordPress内置的wp_get_referer()函数获取上一页链接,比直接操作$_SERVER变量更安全。同时要处理来源页为空的情况(比如用户直接在地址栏输入wp-login.php),设置网站首页作为默认跳转页。
3. 完整实现代码
function redirect_default_login_to_popup() { // 仅对wp-login.php相关页面进行处理 if ($GLOBALS['pagenow'] !== 'wp-login.php') { return; } // 定义需要拦截的动作:登录、注册、找回密码 $target_actions = array('', 'register', 'lostpassword'); $current_action = isset($_GET['action']) ? $_GET['action'] : ''; if (!in_array($current_action, $target_actions)) { return; } // 获取上一页链接,为空则跳转至首页 $referrer = wp_get_referer(); $redirect_url = $referrer ? $referrer : home_url(); // 添加#login锚点唤起弹窗 $redirect_url = trailingslashit($redirect_url) . '#login'; // 避免循环跳转:如果跳转目标还是wp-login,直接跳首页加锚点 if (strpos($redirect_url, 'wp-login.php') === false) { wp_safe_redirect($redirect_url); exit; } else { wp_safe_redirect(home_url('#login')); exit; } } add_action('login_init', 'redirect_default_login_to_popup');
4. 实现方式合理性说明
这种方案是合适的:
- 强制用户使用统一的弹窗表单,确保会员信息收集的一致性(比如必须填写姓名、同意条款);
- 依赖WordPress原生函数处理重定向和来源页,比自定义逻辑更安全可靠;
- 加入了循环跳转防护,避免用户陷入无限重定向的问题;
- 仅拦截指定的登录相关动作,不会影响后台其他功能的正常使用。
内容的提问来源于stack exchange,提问作者SaltyBoy
相关产品推荐
相关产品推荐

