以下是一个基于WordPress的手机号注册登录插件完整代码方案。我将分步骤为您讲解实现原理并提供完整代码:
<?php
/*
Plugin Name: 手机号登录注册
Description: 提供手机号注册、登录和短信验证功能
Version: 1.0
Author: Your Name
*/
// 创建必要的数据表(用于存储短信验证记录)
register_activation_hook(__FILE__, 'create_sms_table');
function create_sms_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'sms_verification';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
phone varchar(20) NOT NULL,
code varchar(10) NOT NULL,
created_at datetime NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
// 添加手机号字段到注册表单
add_action('register_form', 'add_phone_field');
function add_phone_field() {
?>
<p>
<label for="phone">手机号<br>
<input type="text" name="phone" id="phone" class="input" value="" required /></label>
</p>
<p>
<label for="sms_code">短信验证码<br>
<input type="text" name="sms_code" id="sms_code" class="input" required />
<button type="button" id="send-sms" style="margin-top:5px">获取验证码</button>
</label>
</p>
<?php
}
// 验证注册信息
add_filter('registration_errors', 'verify_phone_registration', 10, 3);
function verify_phone_registration($errors, $sanitized_user_login, $user_email) {
if (empty($_POST['phone'])) {
$errors->add('phone_error', '手机号不能为空');
}
if (empty($_POST['sms_code'])) {
$errors->add('sms_code_error', '验证码不能为空');
}
// 验证手机号格式
if (!preg_match('/^1[3-9]\d{9}$/', $_POST['phone'])) {
$errors->add('phone_format_error', '手机号格式不正确');
}
// 验证短信验证码
if (!verify_sms_code($_POST['phone'], $_POST['sms_code'])) {
$errors->add('sms_verify_error', '短信验证码错误或已过期');
}
return $errors;
}
// 保存手机号到用户元数据
add_action('user_register', 'save_phone_number');
function save_phone_number($user_id) {
if (!empty($_POST['phone'])) {
update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
}
}
// 添加手机号登录方式
add_action('login_form', 'add_phone_login');
function add_phone_login() {
?>
<p>
<label for="phone">手机号/用户名/邮箱<br>
<input type="text" name="phone" id="phone" class="input" />
</label>
</p>
<?php
}
// 处理手机号登录验证
add_filter('authenticate', 'phone_number_authenticate', 30, 3);
function phone_number_authenticate($user, $username, $password) {
if (is_a($user, 'WP_User')) {
return $user;
}
if (!empty($_POST['phone'])) {
$phone = sanitize_text_field($_POST['phone']);
$user = get_user_by_phone($phone);
if ($user && wp_check_password($password, $user->user_pass, $user->ID)) {
return $user;
}
return new WP_Error('invalid_credentials', '手机号或密码错误');
}
return $user;
}
// 根据手机号获取用户
function get_user_by_phone($phone) {
global $wpdb;
$user = $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM $wpdb->users
INNER JOIN $wpdb->usermeta
ON $wpdb->users.ID = $wpdb->usermeta.user_id
WHERE $wpdb->usermeta.meta_key = 'phone'
AND $wpdb->usermeta.meta_value = %s",
$phone
)
);
return $user;
}
// 短信验证相关功能
function verify_sms_code($phone, $code) {
global $wpdb;
$table = $wpdb->prefix . 'sms_verification';
$result = $wpdb->get_row(
$wpdb->prepare(
"SELECT * FROM $table
WHERE phone = %s
AND code = %s
AND created_at >= DATE_SUB(NOW(), INTERVAL 5 MINUTE)",
$phone, $code
)
);
return $result ? true : false;
}
// 发送短信验证码接口
add_action('wp_ajax_send_sms', 'send_sms_verification');
add_action('wp_ajax_nopriv_send_sms', 'send_sms_verification');
function send_sms_verification() {
$phone = isset($_POST['phone']) ? sanitize_text_field($_POST['phone']) : '';
if (!preg_match('/^1[3-9]\d{9}$/', $phone)) {
wp_send_json_error('手机号格式错误');
}
// 生成随机验证码
$code = str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
// 保存到数据库
global $wpdb;
$wpdb->insert($wpdb->prefix . 'sms_verification', [
'phone' => $phone,
'code' => $code,
'created_at' => current_time('mysql')
]);
// 实际发送短信需要接入第三方API(此处为示例)
$result = send_sms_api($phone, $code);
if ($result) {
wp_send_json_success('验证码已发送');
} else {
wp_send_json_error('短信发送失败');
}
}
// 示例短信发送函数(需替换为真实短信服务)
function send_sms_api($phone, $code) {
// 示例:这里需要接入真实短信服务API
// 例如阿里云、腾讯云、云片等第三方服务
// 返回true表示发送成功
// 测试用:直接返回true
return true;
}
// 添加前端JavaScript
add_action('login_footer', 'add_sms_script');
function add_sms_script() {
?>
<script>
jQuery(document).ready(function($) {
$('#send-sms').click(function() {
var phone = $('#phone').val();
$.post(ajaxurl, {
action: 'send_sms',
phone: phone
}, function(response) {
if (response.success) {
alert('验证码已发送');
startCountdown();
} else {
alert(response.data);
}
});
});
function startCountdown() {
var count = 60;
var timer = setInterval(function() {
$('#send-sms').text(count + '秒后重发');
if (count-- <= 0) {
clearInterval(timer);
$('#send-sms').text('获取验证码').prop('disabled', false);
}
}, 1000);
}
});
</script>
<?php
}
// 在用户资料中添加手机号字段
add_action('show_user_profile', 'add_phone_profile_field');
add_action('edit_user_profile', 'add_phone_profile_field');
function add_phone_profile_field($user) {
?>
<h3>手机号码</h3>
<table class="form-table">
<tr>
<th><label for="phone">手机号</label></th>
<td>
<input type="text" name="phone" id="phone"
value="<?php echo esc_attr(get_user_meta($user->ID, 'phone', true)); ?>"
class="regular-text" />
</td>
</tr>
</table>
<?php
}
// 保存用户资料中的手机号
add_action('personal_options_update', 'save_phone_profile_field');
add_action('edit_user_profile_update', 'save_phone_profile_field');
function save_phone_profile_field($user_id) {
if (current_user_can('edit_user', $user_id)) {
update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
}
}
这个插件提供了以下功能:
- 手机号注册(带短信验证码)
- 手机号登录
- 短信验证码发送(需要接入第三方API)
- 用户资料手机号管理
- 验证码有效期管理(5分钟)
- 手机号格式验证
使用方法:
- 将代码保存为
mobile-login.php
- 上传到 WordPress 的插件目录
/wp-content/plugins/
- 在后台启用插件
需要完善的部分:
- 在
send_sms_api()
函数中接入真实的短信服务API - 可根据需要修改短信验证码有效期(当前设置为5分钟)
- 可自定义短信模板内容
- 可添加国际手机号支持
安全注意事项:
- 建议在生产环境中启用HTTPS
- 建议添加短信发送频率限制
- 建议使用更复杂的验证码生成方式
- 建议记录短信发送日志
您需要根据实际需求:
- 选择合适的短信服务商(如阿里云、腾讯云)
- 在代码中替换相应的API调用
- 可能需要申请相关资质(如电信增值业务许可证)
需要帮助接入具体短信服务API可告知您选择的短信平台,我可提供对接代码示例
提示:仅供参考