wp_insert_user là hàm dùng để cập nhật thông tin thành viên (update user) hoặc để thêm (insert) thành viên mới vào cơ sở dữ liệu. wp_insert_user() có thể được sử dụng ở bất cứ đâu, miễn là gọi được hàm này, kể cả ở code của các bên thứ ba.
Mặc định wp_insert_user($userdata) sẽ trả về id của thành viên được thêm, hoặc nếu id của thành viên được xác định trong mảng $userdata rồi thì nó sẽ cập nhật thông tin của thành viên có id đã được xác định.
Hầu hết các trường trong mảng $userdata có các bộ lọc được liên kết với các giá trị.
Các trường hợp ngoại lệ là ‘ID’, ‘rich_editing’, ‘syntax_highlighting’, ‘comment_shortcuts’, ‘admin_color’, ‘use_ssl’, ‘user_registered’, ‘user_activation_key’, ‘spam’ và ‘role’. Các bộ lọc có tiền tố ‘pre_user_’ theo sau là tên trường. Ví dụ như trường ‘description’ sẽ có bộ lọc được gọi là ‘pre_user_description’ có thể được nối vào.
Table of Contents
Hàm wp_insert_user nằm ở đâu:
Các bạn có thể tìm thấy hàm này ở file: wp-includes/user.php
function wp_insert_user( $userdata ) { global $wpdb; if ( $userdata instanceof stdClass ) { $userdata = get_object_vars( $userdata ); } elseif ( $userdata instanceof WP_User ) { $userdata = $userdata->to_array(); } if ( ! empty( $userdata['ID'] ) ) { $ID = (int) $userdata['ID']; $update = true; $old_user_data = get_userdata( $ID ); if ( ! $old_user_data ) { return new WP_Error( 'invalid_user_id', __( 'Invalid user ID.' ) ); } $user_pass = ! empty( $userdata['user_pass'] ) ? $userdata['user_pass'] : $old_user_data->user_pass; } else { $update = false; // Hash the password. $user_pass = wp_hash_password( $userdata['user_pass'] ); } $sanitized_user_login = sanitize_user( $userdata['user_login'], true ); $pre_user_login = apply_filters( 'pre_user_login', $sanitized_user_login ); $user_login = trim( $pre_user_login ); if ( empty( $user_login ) ) { return new WP_Error( 'empty_user_login', __( 'Cannot create a user with an empty login name.' ) ); } elseif ( mb_strlen( $user_login ) > 60 ) { return new WP_Error( 'user_login_too_long', __( 'Username may not be longer than 60 characters.' ) ); } if ( ! $update && username_exists( $user_login ) ) { return new WP_Error( 'existing_user_login', __( 'Sorry, that username already exists!' ) ); } $illegal_logins = (array) apply_filters( 'illegal_user_logins', array() ); if ( in_array( strtolower( $user_login ), array_map( 'strtolower', $illegal_logins ), true ) ) { return new WP_Error( 'invalid_username', __( 'Sorry, that username is not allowed.' ) ); } if ( ! empty( $userdata['user_nicename'] ) ) { $user_nicename = sanitize_user( $userdata['user_nicename'], true ); if ( mb_strlen( $user_nicename ) > 50 ) { return new WP_Error( 'user_nicename_too_long', __( 'Nicename may not be longer than 50 characters.' ) ); } } else { $user_nicename = mb_substr( $user_login, 0, 50 ); } $user_nicename = sanitize_title( $user_nicename ); $user_nicename = apply_filters( 'pre_user_nicename', $user_nicename ); $user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $user_nicename, $user_login ) ); if ( $user_nicename_check ) { $suffix = 2; while ( $user_nicename_check ) { // user_nicename allows 50 chars. Subtract one for a hyphen, plus the length of the suffix. $base_length = 49 - mb_strlen( $suffix ); $alt_user_nicename = mb_substr( $user_nicename, 0, $base_length ) . "-$suffix"; $user_nicename_check = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1", $alt_user_nicename, $user_login ) ); $suffix++; } $user_nicename = $alt_user_nicename; } $raw_user_email = empty( $userdata['user_email'] ) ? '' : $userdata['user_email']; $user_email = apply_filters( 'pre_user_email', $raw_user_email ); if ( ( ! $update || ( ! empty( $old_user_data ) && 0 !== strcasecmp( $user_email, $old_user_data->user_email ) ) ) && ! defined( 'WP_IMPORTING' ) && email_exists( $user_email ) ) { return new WP_Error( 'existing_user_email', __( 'Sorry, that email address is already used!' ) ); } $raw_user_url = empty( $userdata['user_url'] ) ? '' : $userdata['user_url']; $user_url = apply_filters( 'pre_user_url', $raw_user_url ); $user_registered = empty( $userdata['user_registered'] ) ? gmdate( 'Y-m-d H:i:s' ) : $userdata['user_registered']; $user_activation_key = empty( $userdata['user_activation_key'] ) ? '' : $userdata['user_activation_key']; if ( ! empty( $userdata['spam'] ) && ! is_multisite() ) { return new WP_Error( 'no_spam', __( 'Sorry, marking a user as spam is only supported on Multisite.' ) ); } $spam = empty( $userdata['spam'] ) ? 0 : (bool) $userdata['spam']; $meta = array(); $nickname = empty( $userdata['nickname'] ) ? $user_login : $userdata['nickname']; $meta['nickname'] = apply_filters( 'pre_user_nickname', $nickname ); $first_name = empty( $userdata['first_name'] ) ? '' : $userdata['first_name']; $meta['first_name'] = apply_filters( 'pre_user_first_name', $first_name ); $last_name = empty( $userdata['last_name'] ) ? '' : $userdata['last_name']; $meta['last_name'] = apply_filters( 'pre_user_last_name', $last_name ); if ( empty( $userdata['display_name'] ) ) { if ( $update ) { $display_name = $user_login; } elseif ( $meta['first_name'] && $meta['last_name'] ) { /* translators: 1: User's first name, 2: Last name. */ $display_name = sprintf( _x( '%1$s %2$s', 'Display name based on first name and last name' ), $meta['first_name'], $meta['last_name'] ); } elseif ( $meta['first_name'] ) { $display_name = $meta['first_name']; } elseif ( $meta['last_name'] ) { $display_name = $meta['last_name']; } else { $display_name = $user_login; } } else { $display_name = $userdata['display_name']; } $display_name = apply_filters( 'pre_user_display_name', $display_name ); $description = empty( $userdata['description'] ) ? '' : $userdata['description']; $meta['description'] = apply_filters( 'pre_user_description', $description ); $meta['rich_editing'] = empty( $userdata['rich_editing'] ) ? 'true' : $userdata['rich_editing']; $meta['syntax_highlighting'] = empty( $userdata['syntax_highlighting'] ) ? 'true' : $userdata['syntax_highlighting']; $meta['comment_shortcuts'] = empty( $userdata['comment_shortcuts'] ) || 'false' === $userdata['comment_shortcuts'] ? 'false' : 'true'; $admin_color = empty( $userdata['admin_color'] ) ? 'fresh' : $userdata['admin_color']; $meta['admin_color'] = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $admin_color ); $meta['use_ssl'] = empty( $userdata['use_ssl'] ) ? 0 : (bool) $userdata['use_ssl']; $meta['show_admin_bar_front'] = empty( $userdata['show_admin_bar_front'] ) ? 'true' : $userdata['show_admin_bar_front']; $meta['locale'] = isset( $userdata['locale'] ) ? $userdata['locale'] : ''; $compacted = compact( 'user_pass', 'user_nicename', 'user_email', 'user_url', 'user_registered', 'user_activation_key', 'display_name' ); $data = wp_unslash( $compacted ); if ( ! $update ) { $data = $data + compact( 'user_login' ); } if ( is_multisite() ) { $data = $data + compact( 'spam' ); } $data = apply_filters( 'wp_pre_insert_user_data', $data, $update, $update ? (int) $ID : null ); if ( empty( $data ) || ! is_array( $data ) ) { return new WP_Error( 'empty_data', __( 'Not enough data to create this user.' ) ); } if ( $update ) { if ( $user_email !== $old_user_data->user_email || $user_pass !== $old_user_data->user_pass ) { $data['user_activation_key'] = ''; } $wpdb->update( $wpdb->users, $data, compact( 'ID' ) ); $user_id = (int) $ID; } else { $wpdb->insert( $wpdb->users, $data ); $user_id = (int) $wpdb->insert_id; } $user = new WP_User( $user_id ); $meta = apply_filters( 'insert_user_meta', $meta, $user, $update ); // Update user meta. foreach ( $meta as $key => $value ) { update_user_meta( $user_id, $key, $value ); } foreach ( wp_get_user_contact_methods( $user ) as $key => $value ) { if ( isset( $userdata[ $key ] ) ) { update_user_meta( $user_id, $key, $userdata[ $key ] ); } } if ( isset( $userdata['role'] ) ) { $user->set_role( $userdata['role'] ); } elseif ( ! $update ) { $user->set_role( get_option( 'default_role' ) ); } clean_user_cache( $user_id ); if ( $update ) { do_action( 'profile_update', $user_id, $old_user_data ); if ( isset( $userdata['spam'] ) && $userdata['spam'] != $old_user_data->spam ) { if ( 1 == $userdata['spam'] ) { do_action( 'make_spam_user', $user_id ); } else { do_action( 'make_ham_user', $user_id ); } } } else { do_action( 'user_register', $user_id ); } return $user_id; }
Các tham số $userdata truyền vào wp_insert_user
Đây là các thông số có thể sử dụng để truyền vào hàm wp_insert_user. Trong số này quan trọng nhất là ID. Nếu có ID thì nó sẽ update thông tin thành viên với ID đó. Nếu không có ID thì nó sẽ thêm mới thành viên và giá trị trả về là ID của thành viên được thêm.
$userdata = array( 'ID' => 0, //(int) User ID. If supplied, the user will be updated. 'user_pass' => '', //(string) The plain-text user password. 'user_login' => '', //(string) The user's login username. 'user_nicename' => '', //(string) The URL-friendly user name. 'user_url' => '', //(string) The user URL. 'user_email' => '', //(string) The user email address. 'display_name' => '', //(string) The user's display name. Default is the user's username. 'nickname' => '', //(string) The user's nickname. Default is the user's username. 'first_name' => '', //(string) The user's first name. For new users, will be used to build the first part of the user's display name if $display_name is not specified. 'last_name' => '', //(string) The user's last name. For new users, will be used to build the second part of the user's display name if $display_name is not specified. 'description' => '', //(string) The user's biographical description. 'rich_editing' => '', //(string|bool) Whether to enable the rich-editor for the user. False if not empty. 'syntax_highlighting' => '', //(string|bool) Whether to enable the rich code editor for the user. False if not empty. 'comment_shortcuts' => '', //(string|bool) Whether to enable comment moderation keyboard shortcuts for the user. Default false. 'admin_color' => '', //(string) Admin color scheme for the user. Default 'fresh'. 'use_ssl' => '', //(bool) Whether the user should always access the admin over https. Default false. 'user_registered' => '', //(string) Date the user registered. Format is 'Y-m-d H:i:s'. 'show_admin_bar_front' => '', //(string|bool) Whether to display the Admin Bar for the user on the site's front end. Default true. 'role' => '', //(string) User's role. 'locale' => '', //(string) User's locale. Default empty. );
Cách sử dụng hàm wp_inser_user
Cách sử dụng hàm wp_insert_user khá đơn giản. Đầu tiên bạn phải khai báo các trường cần thêm cho user đó trong mảng $userdata. Sau đó dùng hàm này để thêm vào.
Ví dụ khi thêm mới thành viên:
$website = "https://huyhoa.net"; $userdata = array( 'user_login' => 'admin', 'user_url' => $website, 'user_email' => '[email protected]', 'user_registered' => date_i18n('Y-m-d H:i:s'), 'user_pass' => md5(abc1234) // When creating an user, `user_pass` is expected. ); $user_id = wp_insert_user( $userdata ) ; // On success. if ( ! is_wp_error( $user_id ) ) { echo "User created : ". $user_id; }
Ví dụ khi cập nhật (update) thông tin thành viên.
$user_id = 6; // Cập nhật thông tin thành viên có ID là 6 $website = 'https://huyhoa.net'; wp_insert_user( [ 'ID' => $user_id, 'user_url' => $website ] ) ;
Vì hàm này không mã hóa thông tin mật khẩu, nên nếu các bạn dùng wp_insert_user mà để password dạng text thì user sẽ không sử dụng được mật khẩu đó. Ví dụ bên trên mình phải khai báo bằng cách mã hóa md5 cho mật khẩu abc1234.
Nếu các bạn cập nhật thông tin thành viên thì nên sử dụng hàm wp_update_user thì khi khai báo user_pass => ‘abc1234’ nó sẽ tự động mã hóa mật khẩu dùng hàm wp_hash_password().
wp_insert_user và user role
Như bên trên đã phân tích, khi thêm thành viên mới (add user), ta có thể truyền giá trị role vào mảng $userdata, nhưng mình gặp trường hợp wp_insert_user role not working rồi. Đây là cách xử lý của mình để có thể thêm user role một cách chuẩn xác:
$userdata = array ( 'user_login' => $username, 'user_email' => $email, 'user_pass' => md5($password), 'user_url' => $website, 'first_name' => $first_name, 'last_name' => $last_name, 'nickname' => $nickname, 'description' => $bio, ) ; $id = wp_insert_user( $userdata ) ; wp_update_user( array ('ID' => $id, 'role' => 'editor') ) ;
Trong trường hợp này, để giải quyết vấn đề wp_insert_user role not working thì mình làm 2 bước, bước đầu tiên là thêm thành viên đó vào cơ sở dữ liệu. Sau đó khi thêm thành công nó sẽ trả về id của thành viên đó nên mình tiếp tục cập nhật role cho thành viên đó dùng hàm wp_update_user
wp_insert_user trả về giá trị 0 khi thêm thành viên mới
Một vấn đề nữa khi sử dụng hàm này là thi thoảng khi thêm thành viên mới, giá trị trả về không phải là ID của thành viên mà lại là 0. Đây là trường hợp mình cũng từng gặp phải. Nguyên nhân là do một trong các trường các bạn insert dữ liệu trong mảng $userdata bị quá ký tự. Ví dụ như trường url nó chỉ nhận 100 ký tự, nếu bạn chèn website vào trường url có quá 100 ký tự thì chắc chắn giá trị trả về của hàm wp_insert_user($userdata) chắc chắn sẽ là 0.
Một số ví dụ mẫu dùng hàm wp_insert_user()
Hàm đăng ký thành viên qua Ajax
function ajax_register() { // First check the nonce, if it fails the function will break check_ajax_referer('ajax-register-nonce', 'security'); // Nonce is checked, get the POST data and sign user on $info = array(); $info['user_nicename'] = $info['nickname'] = $info['display_name'] = $info['first_name'] = $info['user_login'] = sanitize_user($_POST['username']); $info['user_pass'] = sanitize_text_field($_POST['password']); $info['user_email'] = sanitize_email($_POST['email']); // Register the user $user_register = wp_insert_user($info); if (is_wp_error($user_register)) { $error = $user_register->get_error_codes(); if (in_array('empty_user_login', $error)) { echo json_encode(array('loggedin' => false, 'message' => __('Xin lỗi, thông tin đăng nhập không hợp lệ.'))); } else { if (in_array('existing_user_login', $error)) { echo json_encode(array('loggedin' => false, 'message' => __('Xin lỗi, tên đăng nhập này đã tồn tại.'))); } else { if (in_array('existing_user_email', $error)) { echo json_encode(array('loggedin' => false, 'message' => __('Xin lỗi, email này đã tồn tại.'))); } } } // else echo json_encode(array('loggedin'=>false, 'message'=>__($user_register->get_error_messages($error)))); } else { wp_insert_user($info); echo json_encode(array('loggedin' => true, 'message' => __('Đăng ký thành công.'))); } die; }
Hàm đăng ký thành viên hoặc login sử dụng Instagram
function ins_oauth() { $code = $_GET['code']; $url = "https://api.instagram.com/oauth/access_token"; $data = array('client_id' => INS_APPID, 'client_secret' => INS_APPSECRET, 'grant_type' => 'authorization_code', 'redirect_uri' => home_url('/?type=instagram'), 'code' => $code); $response = wp_remote_post($url, array('method' => 'POST', 'body' => $data)); $output = json_decode($response['body'], true); $token = $output['access_token']; $user = $output['user']; $ins_id = $user['id']; $name = $user['username']; if (!$ins_id) { wp_redirect(home_url('/?3' . $douban_id)); exit; } if (is_user_logged_in()) { $this_user = wp_get_current_user(); update_user_meta($this_user->ID, "instagram_id", $ins_id); ins_ouath_redirect(); } else { $user_ins = get_users(array("meta_key " => "instagram_id", "meta_value" => $ins_id)); if (is_wp_error($user_ins) || !count($user_ins)) { $login_name = wp_create_nonce($ins_id); $random_password = wp_generate_password($length = 12, $include_standard_special_chars = false); $userdata = array('user_login' => $login_name, 'display_name' => $name, 'user_email' => '', 'user_pass' => $random_password, 'nick_name' => $name); $user_id = wp_insert_user($userdata); wp_signon(array("user_login" => $login_name, "user_password" => $random_password), false); update_user_meta($user_id, "instagram_id", $ins_id); ins_ouath_redirect(); } else { wp_set_auth_cookie($user_ins[0]->ID); ins_ouath_redirect(); } } }
Hàm đăng ký thành viên trong plugin hoặc mã nguồn của bên thứ 3:
public function registration($name, $pass, $email, $money) { $data = array('user_pass' => $pass, 'user_login' => $name, 'user_email' => $email, 'perfectmoney' => $money); $user_id = wp_insert_user($data); }
MASS IMPORT USERS INTO WORDPRESS
include('includes/connection.php'); $query2 = "SELECT * FROM users"; $result2 = mysqli_query( $conn, $query2); if( mysqli_num_rows($result2) > 0 ) { while( $row = mysqli_fetch_assoc($result2) ) { $name = $row['name']; echo "<strong>ID:</strong>".$row['id']." <strong>login:</strong>".$row->user_name." <strong>password:</strong> ".$row->password." <strong>e-mail:</strong>".$row->email_address." <strong>name:</strong> ".$row->name." <strong>surname:</strong> ".$row->surname."<br/>"; // Add the ID to trick WP $add_id = "INSERT INTO ".$wpdb->users." (id, user_login) VALUES (".$row->id.",'"."$row->user_name"."' ); "; mysql_query($add_id) or die(mysql_error()); // Add the rest $userdata = array( 'ID' => $row->id, 'user_login' => $row->user_name, 'user_pass' => wp_hash_password($row->password), 'user_nicename' => $row->user_name, 'user_email' => $row->email_address, 'first_name' => $row->name, 'last_name' => $row->surname, 'role' => 'subscriber' ); wp_insert_user($userdata) ; } } mysql_close($connection);
wp_insert_user khác gì so với wp_create_user
Để hiểu sự khác nhau giữa wp_insert_user và wp_create_user thì ta xem hai ví dụ bên dưới đây
wp_create_user:
$user_id = wp_create_user( $user_name, $random_password, $user_email );
wp_insert_user:
$userdata = array ( 'user_login' => $user_name, 'user_email' => $user_email, 'user_pass' => md5($random_password), 'user_url' => $website, 'first_name' => $first_name, 'last_name' => $last_name, 'nickname' => $nickname, 'description' => $bio, ) ; $user_id = wp_insert_user( $userdata ) ;
Có thể thấy, hai hàm này đều có chức năng là insert thành viên vào cơ sở dữ liệu, tuy nhiên wp_create_user khá đơn giản. Nó chỉ thêm username, mật khẩu và email của thành viên. Ngoài ra không thể thêm các meta data cho user được. wp_insert_user thì khác, nó có thể thêm khá nhiều dữ liệu được truyền trong mảng $userdata.
Trên thực tế thì wp_create_user cũng sẽ dùng hàm wp_insert_user để thêm thành viên vào cơ sở dữ liệu. Có thể thấy rõ điều này khi xem chi tiết về hàm wp_create_user tại file này: wp-includes/user.php
function wp_create_user( $username, $password, $email = '' ) { $user_login = wp_slash( $username ); $user_email = wp_slash( $email ); $user_pass = $password; $userdata = compact( 'user_login', 'user_email', 'user_pass' ); return wp_insert_user( $userdata ); }
Trên đây là những thông tin cần thiết và hữu ích trong quá trình sử dụng hàm wp_insert_user. Hy vọng nó mang lại cho các bạn cái nhìn chi tiết hơn về cách sử dụng hàm này. Nếu có khó khăn gì hoặc cần trợ giúp gì, các bạn có thể comment bên dưới, bọn mình sẽ cố gắng hỗ trợ nhanh nhất có thể.
Ngoài ra, các bạn cũng có thể tham khảo thêm một số thông tin về hàm này tại trang web dành cho nhà phát triển ứng dụng WordPress tại đây: https://developer.wordpress.org/reference/functions/wp_insert_user/