如何在WordPress中使用user_register钩子添加用户手机号自定义字段
WordPress通过AJAX创建用户并利用user_register钩子添加手机号自定义字段
先修正代码中的函数名不匹配问题
你当前代码里add_action指定的回调函数是register_user,但实际定义的函数名是registrar_cliente,这会导致AJAX调用失效,必须统一函数名,下面示例统一为register_user。
实现方案:两种方式添加手机号自定义字段
方式一:创建用户后直接更新用户元(简单直接)
在AJAX函数中,当wp_insert_user成功创建用户后,直接调用update_user_meta保存手机号到用户自定义字段:
add_action('wp_ajax_nopriv_register', 'register_user'); add_action('wp_ajax_register', 'register_user'); function register_user(){ // 验证请求合法性(必须加,防止CSRF攻击) if(!isset($_POST['dataForPHP']) || !wp_verify_nonce($_POST['nonce'], 'user_register_nonce')){ wp_send_json_error(['msg' => '非法请求']); wp_die(); } $phone = wp_filter_nohtml_kses($_POST['dataForPHP'][0]); $name = wp_filter_nohtml_kses($_POST['dataForPHP'][1]); $email = wp_filter_nohtml_kses($_POST['dataForPHP'][2]); // 生成随机密码,也可以由前端传递 $password = wp_generate_password(12, false); // 完善用户数据数组 $userdata = [ 'user_login' => $email, // 用邮箱作为登录名,也可替换为手机号 'user_email' => $email, 'user_pass' => $password, 'display_name' => $name, 'first_name' => $name ]; $user_id = wp_insert_user($userdata); if(!is_wp_error($user_id)){ // 保存手机号到用户自定义字段 update_user_meta($user_id, 'user_phone', $phone); wp_send_json_success(['msg' => '注册成功', 'user_id' => $user_id]); } else { wp_send_json_error(['msg' => $user_id->get_error_message()]); } wp_die(); }
方式二:利用user_register钩子实现(符合WordPress钩子机制)
user_register钩子会在用户成功注册(包括通过wp_insert_user创建的用户)后触发,我们可以在钩子函数中保存手机号:
- 先注册
user_register钩子:
// 注册user_register钩子,优先级10,接受2个参数 add_action('user_register', 'save_user_mobile_field', 10, 2); function save_user_mobile_field($user_id, $userdata){ // 从userdata中取出提前存入的手机号 if(isset($userdata['user_phone'])){ $clean_phone = wp_filter_nohtml_kses($userdata['user_phone']); update_user_meta($user_id, 'user_phone', $clean_phone); } }
- 然后修改AJAX函数,把手机号存入
$userdata数组(wp_insert_user会忽略未定义的键,但会把完整的$userdata传递给钩子):
add_action('wp_ajax_nopriv_register', 'register_user'); add_action('wp_ajax_register', 'register_user'); function register_user(){ if(!isset($_POST['dataForPHP']) || !wp_verify_nonce($_POST['nonce'], 'user_register_nonce')){ wp_send_json_error(['msg' => '非法请求']); wp_die(); } $phone = wp_filter_nohtml_kses($_POST['dataForPHP'][0]); $name = wp_filter_nohtml_kses($_POST['dataForPHP'][1]); $email = wp_filter_nohtml_kses($_POST['dataForPHP'][2]); $password = wp_generate_password(12, false); $userdata = [ 'user_login' => $email, 'user_email' => $email, 'user_pass' => $password, 'display_name' => $name, 'first_name' => $name, // 自定义键,用于传递给user_register钩子 'user_phone' => $phone ]; $user_id = wp_insert_user($userdata); if(is_wp_error($user_id)){ wp_send_json_error(['msg' => $user_id->get_error_message()]); } else { wp_send_json_success(['msg' => '注册成功', 'user_id' => $user_id]); } wp_die(); }
注意事项
- 必须添加
wp_nonce验证:前端AJAX请求时,要通过wp_create_nonce('user_register_nonce')生成随机数,作为参数传递到后端,防止跨站请求伪造。 - 用户元字段的键名(比如
user_phone)可以自定义,后续获取时保持一致即可,用get_user_meta($user_id, 'user_phone', true)获取。 - 处理错误情况:
wp_insert_user会返回WP_Error对象(比如邮箱已被注册),需要捕获并返回错误信息给前端。
内容的提问来源于stack exchange,提问作者Cristian B_F
相关产品推荐
相关产品推荐

