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

WordPress手机号登录功能故障求助(基于user_meta存储)

修复WordPress手机号登录功能问题

问题分析

你当前遇到的Invalid username, email address or incorrect password.错误,主要源于钩子逻辑处理不严谨、手机号格式判断范围过窄,以及未考虑插件冲突等问题。

具体修复步骤

1. 修正authenticate钩子的核心逻辑

原代码未先判断传入的$user参数状态,导致核心验证的错误被干扰或未正确传递。修改钩子函数,优先跳过已验证成功或已出错的场景:

add_filter( 'authenticate', 'phone_number_login_authenticate', 30, 3 );
function phone_number_login_authenticate( $user, $username, $password ) {
    // 若已有合法用户对象,直接返回不干扰原有验证
    if ( $user instanceof WP_User ) {
        return $user;
    }
    // 若已存在错误状态,仅当用户名是手机号格式时替换错误提示
    if ( is_wp_error( $user ) ) {
        if ( preg_match('/^\+?\d{10,15}$/', $username) ) {
            return new WP_Error( 'invalid_login', __( '<strong>ERROR</strong>: Invalid phone number or password.', 'phone-number-login' ) );
        }
        return $user;
    }

    // 兼容带+号的国际手机号格式
    if ( preg_match('/^\+?\d{10,15}$/', $username) ) {
        $user = get_user_by_meta_data( 'pcplugin-phone', $username );

        if ( $user && wp_check_password( $password, $user->user_pass, $user->ID ) ) {
            return $user;
        } else {
            return new WP_Error( 'invalid_login', __( '<strong>ERROR</strong>: Invalid phone number or password.', 'phone-number-login' ) );
        }
    }

    return $user;
}

2. 优化手机号格式判断

原代码用is_numeric()会过滤掉带+号的国际手机号,改用正则表达式匹配更符合实际使用场景的号码格式。

3. 验证用户元数据准确性

  • 确认用户的pcplugin-phone元数据值与登录输入的手机号完全一致(注意无空格、额外符号等差异)
  • 可通过以下调试代码检查指定手机号是否存在对应用户:
// 替换为测试手机号
$test_phone = '13800138000';
$user = get_user_by_meta_data( 'pcplugin-phone', $test_phone );
var_dump($user); // 查看是否返回正确用户对象

4. 处理Loginpress插件冲突

Loginpress可能修改登录流程或authenticate钩子,可尝试:

  • 调整钩子优先级(比如改为20或40),确保你的逻辑在Loginpress验证前后执行
  • 检查Loginpress设置,确认无强制用户名/邮箱登录的限制选项

5. 优化用户查询函数(可选)

原自定义查询函数可替换为WordPress内置函数,避免直接操作数据库:

function get_user_by_meta_data( $meta_key, $meta_value ) {
    $users = get_users( array(
        'meta_key' => $meta_key,
        'meta_value' => $meta_value,
        'number' => 1,
        'fields' => 'ID'
    ) );
    if ( !empty($users) ) {
        return get_user_by( 'ID', $users[0] );
    }
    return false;
}

测试验证

  1. 激活修改后的插件
  2. 使用存在的手机号+正确密码登录,确认登录成功
  3. 使用错误手机号/密码登录,确认返回自定义错误提示
  4. 测试原用户名/邮箱登录功能,确认不受影响

内容的提问来源于stack exchange,提问作者Sanad Qazi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:10:59