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

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函数里有个小问题:&amp;&amp;是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:48:12