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

实现WooCommerce手机号/常规账号双登录的技术问题求助

问题解决:WordPress/WooCommerce支持手机号+账号/邮箱双登录

问题分析

你的代码存在两个核心问题,导致无法同时兼容两种登录方式:

  1. 逻辑顺序错误:你先判断手机号再走常规认证,但WordPress默认的邮箱登录依赖专属认证流程,你的代码跳过了这个环节,直接调用仅处理用户名的认证函数,导致邮箱登录失效。
  2. 手机号判断逻辑疏漏:仅用is_numeric判断会误判带数字的用户名/邮箱,且手机号匹配失败时直接返回错误,阻断了后续常规认证的可能性。

修正后的代码

将以下代码替换你主题functions.php中的原有代码:

/**
 * 支持手机号、用户名、邮箱三种方式登录
 */
add_filter('authenticate', 'custom_login_with_phone_email_username', 30, 3);
function custom_login_with_phone_email_username($user, $username, $password) {
    // 如果已经认证成功或密码为空,直接返回
    if ($user instanceof WP_User || empty($password)) {
        return $user;
    }

    // 先尝试默认的用户名/邮箱登录
    $default_auth = wp_authenticate_username_password(null, $username, $password);
    if (!is_wp_error($default_auth)) {
        return $default_auth;
    }

    // 默认登录失败,尝试手机号登录
    $normalized_phone = preg_replace('/\D/', '', $username);
    if (!empty($normalized_phone)) {
        // 根据 billing_phone 查找用户
        $users = get_users([
            'meta_key'     => 'billing_phone',
            'meta_value'   => $normalized_phone,
            'meta_compare' => '=',
            'number'       => 1 // 只取第一个匹配用户
        ]);

        if (!empty($users)) {
            $target_user = reset($users);
            // 验证该用户的密码
            if (wp_check_password($password, $target_user->user_pass, $target_user->ID)) {
                return $target_user;
            } else {
                return new WP_Error('incorrect_password', __('密码错误,请重试。'));
            }
        }
    }

    // 所有方式都失败,返回统一错误提示
    return new WP_Error('invalid_credentials', __('用户名/邮箱/手机号或密码错误,请重试。'));
}

代码说明

  1. 优先级设置:用30作为钩子优先级,确保在WordPress默认认证逻辑之后执行,不会干扰原有登录流程。
  2. 先默认认证:优先调用官方函数处理用户名/邮箱登录,成功则直接返回用户,保证原有登录方式不受影响。
  3. 手机号验证逻辑:默认登录失败后,再清洗输入内容提取纯数字,查找匹配的手机号用户,直接用密码校验函数验证,避免二次调用认证函数导致的冲突。
  4. 错误处理:统一错误提示,避免泄露用户信息,同时保证所有失败场景都有明确反馈。

注意事项

  • 确保用户的手机号存储在billing_phone元字段中(WooCommerce默认注册流程会自动存储)。
  • 建议将代码放在子主题的functions.php中,避免主题更新时代码丢失。
  • 如果仍有问题,检查PHP错误日志,排查是否有安全类插件修改了认证流程导致冲突。

内容的提问来源于stack exchange,提问作者C G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:27:06