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; }
测试验证
- 激活修改后的插件
- 使用存在的手机号+正确密码登录,确认登录成功
- 使用错误手机号/密码登录,确认返回自定义错误提示
- 测试原用户名/邮箱登录功能,确认不受影响
内容的提问来源于stack exchange,提问作者Sanad Qazi
相关产品推荐
相关产品推荐

