基于WordPress的手机号注册登录插件完整代码方案(纯代码)

以下是一个基于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']));
    }
}

这个插件提供了以下功能:

  1. 手机号注册(带短信验证码)
  2. 手机号登录
  3. 短信验证码发送(需要接入第三方API)
  4. 用户资料手机号管理
  5. 验证码有效期管理(5分钟)
  6. 手机号格式验证

使用方法:

  1. 将代码保存为 mobile-login.php
  2. 上传到 WordPress 的插件目录 /wp-content/plugins/
  3. 在后台启用插件

需要完善的部分:

  1. 在 send_sms_api() 函数中接入真实的短信服务API
  2. 可根据需要修改短信验证码有效期(当前设置为5分钟)
  3. 可自定义短信模板内容
  4. 可添加国际手机号支持

安全注意事项:

  1. 建议在生产环境中启用HTTPS
  2. 建议添加短信发送频率限制
  3. 建议使用更复杂的验证码生成方式
  4. 建议记录短信发送日志

您需要根据实际需求:

  1. 选择合适的短信服务商(如阿里云、腾讯云)
  2. 在代码中替换相应的API调用
  3. 可能需要申请相关资质(如电信增值业务许可证)

需要帮助接入具体短信服务API可告知您选择的短信平台,我可提供对接代码示例

提示:仅供参考