WordPress重定向wp-login.php后登录按钮持续跳转至同一自定义登录页的问题求助
解决自定义登录页循环跳转的问题
看起来你遇到了典型的登录循环跳转问题,核心原因是:你的自定义登录表单仍然默认提交到wp-login.php,而你添加的重定向代码又把所有访问wp-login.php的请求跳回/login页面,形成了死循环。下面是具体的修复步骤:
1. 修改自定义登录模板的表单提交地址
打开你创建的login模板文件,找到登录表单的action属性,把它从默认的wp-login.php改成当前自定义登录页的URL:
原表单代码可能是这样的:
<form name="loginform" id="loginform" action="<?php echo site_url('wp-login.php', 'login_post'); ?>" method="post">
修改为:
<form name="loginform" id="loginform" action="<?php echo esc_url( get_permalink() ); ?>" method="post">
这样表单就会提交到当前的/login页面,而不是默认的登录入口。
2. 添加登录请求处理逻辑
在主题的functions.php中添加以下代码,用来处理提交到/login页面的登录请求:
add_action('template_redirect', 'handle_custom_login_submission'); function handle_custom_login_submission() { // 仅在自定义登录页且有登录提交时执行 if (isset($_POST['log']) && is_page('login')) { // 整理登录凭证并 sanitize 输入 $creds = array( 'user_login' => sanitize_user($_POST['log']), 'user_password' => $_POST['pwd'], 'remember' => isset($_POST['rememberme']) ? true : false ); // 调用WordPress自带的登录函数 $user = wp_signon($creds, false); if (is_wp_error($user)) { // 登录失败,携带错误信息跳回登录页 $error_msg = urlencode($user->get_error_message()); wp_redirect(add_query_arg('login_error', $error_msg, get_permalink())); exit; } else { // 登录成功,跳转到后台(可根据需求改成首页或其他页面) wp_redirect(admin_url()); exit; } } // 如果有登录错误参数,在页面底部显示错误信息 if (is_page('login') && isset($_GET['login_error'])) { add_action('wp_footer', 'display_custom_login_error'); } } function display_custom_login_error() { $error = urldecode($_GET['login_error']); echo '<div class="login-error" style="color: #dc3232; padding: 10px; background: #fef5f5; margin: 15px 0;">' . esc_html($error) . '</div>'; }
3. 修正原重定向函数的逻辑错误
你原来的prevent_wp_login函数里有个小问题:&&是HTML转义后的字符,PHP中应该用&&;另外还要排除登录成功后的登出跳转(比如wp-login.php?loggedout=true),避免不必要的重定向。修改后的代码如下:
add_action('init', 'prevent_wp_login'); function prevent_wp_login() { global $pagenow; $action = (isset($_GET['action'])) ? $_GET['action'] : ''; // 修复逻辑运算符,同时排除合法的操作场景 if ($pagenow == 'wp-login.php' && (!$action || ($action && !in_array($action, array('logout', 'lostpassword', 'rp', 'resetpass', 'loggedout'))))) { // 用get_permalink获取自定义登录页的正确URL,避免硬编码 $login_page_url = get_permalink(get_page_by_path('login')); wp_redirect($login_page_url); exit(); } }
为什么这样能解决问题?
- 表单提交到自定义登录页,不再触发
wp-login.php的重定向 - 我们手动处理登录验证,成功后直接跳转到目标页面,打破循环
- 修正后的重定向函数只拦截非法访问
wp-login.php的请求,保留了登出、找回密码等合法功能
内容的提问来源于stack exchange,提问作者Mohamed Atta
相关产品推荐
相关产品推荐

