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

WordPress自定义登录表单如何获取并显示官方登录错误提示信息

问题原因

你直接调用global $errors不生效的核心原因是:$errors全局变量仅默认在WordPress原生wp-login.php页面加载时初始化,自定义独立登录页面没有接收登录失败后回传的错误上下文,所以无法直接获取到错误内容。

以下是两种可直接落地的实现方案:


方案1:URL参数传递错误(轻量无依赖)

无需额外开启Session,适合仅需展示基础错误提示的场景。

  1. 首先在主题functions.php文件中加入以下代码,拦截登录状态并跳转回自定义登录页:
// 登录失败跳转回自定义登录页,携带错误标识
add_action('wp_login_failed', 'custom_login_fail_redirect');
function custom_login_fail_redirect() {
    // 替换为你自己的自定义登录页访问地址
    $custom_login_url = home_url('/custom-login/');
    wp_redirect(add_query_arg('login_err', '1', $custom_login_url));
    exit;
}

// 拦截用户名/密码为空的错误场景
add_filter('authenticate', 'custom_login_empty_check', 1, 3);
function custom_login_empty_check($user, $username, $password) {
    if (empty($username) || empty($password)) {
        $custom_login_url = home_url('/custom-login/');
        wp_redirect(add_query_arg('login_err', '2', $custom_login_url));
        exit;
    }
    return $user;
}
  1. 修改my-custom-login.php中的错误输出代码,替换你原来注释位置的代码即可:
<?php
$error = '';
if (isset($_GET['login_err'])) {
    $err_code = intval($_GET['login_err']);
    switch ($err_code) {
        case 1:
            $error = '用户名或密码错误,请重试';
            break;
        case 2:
            $error = '请输入用户名和密码';
            break;
        default:
            $error = '登录出现未知错误,请稍后再试';
    }
}
// 安全转义后输出
echo '<div class="log-msg">'.esc_html($error).'</div>';
?>

方案2:Session存储完整原生错误(适配所有错误场景)

可以完整输出WordPress所有原生登录错误提示(比如账号封禁、邮箱验证提示等),适合功能复杂的站点使用。

  1. 首先在主题functions.php文件中加入以下代码:
// 开启Session存储登录错误信息
add_action('init', 'custom_login_session_init');
function custom_login_session_init() {
    if (!session_id()) {
        session_start();
    }
}

// 登录失败时将原生错误存入Session
add_action('wp_login_failed', 'custom_login_save_error');
function custom_login_save_error() {
    global $errors;
    $_SESSION['login_error_msg'] = $errors->get_error_message();
    $custom_login_url = home_url('/custom-login/');
    wp_redirect($custom_login_url);
    exit;
}

// 登录成功后清空错误Session,避免重复提示
add_action('wp_login', 'custom_login_clear_session', 10, 2);
function custom_login_clear_session($user_login, $user) {
    if (isset($_SESSION['login_error_msg'])) {
        unset($_SESSION['login_error_msg']);
    }
}
  1. 修改my-custom-login.php中的错误输出代码:
<?php
$error = '';
if (isset($_SESSION['login_error_msg'])) {
    $error = $_SESSION['login_error_msg'];
    // 显示一次后立即清空,刷新页面不会重复提示
    unset($_SESSION['login_error_msg']);
}
echo '<div class="log-msg">'.esc_html($error).'</div>';
?>

注意事项

  • 代码中home_url('/custom-login/')需要替换为你自己的自定义登录页实际访问路径
  • 如果站点使用了缓存插件,需要将自定义登录页加入缓存排除列表,避免错误信息被缓存展示给其他用户
  • 输出错误信息时使用esc_html()做安全转义,避免XSS安全风险

内容的提问来源于stack exchange,提问作者Javier Tamayo Maluenda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:24:06