Search code examples
phpwordpresswordpress-rest-api

WordPress Rest API - Register user - fields not saving?


I'm using the below code in my functions.php file to register a new user to my WP site via the WP Rest API. It successfully registers the user, but for some reason when I post my parameters to this (first_name & last_name), the first name and last name fields on the back end remain empty?

functions.php

    add_action('rest_api_init', 'wp_rest_user_endpoints');
    /**
     * Register a new user
     *
     * @param  WP_REST_Request $request Full details about the request.
     * @return array $args.
     **/
    function wp_rest_user_endpoints($request) {
      /**
       * Handle Register User request.
       */
      register_rest_route('wp/v2', 'users/register', array(
        'methods' => 'POST',
        'callback' => 'wc_rest_user_endpoint_handler',
         'args' => array(),
      ));
    }
    function wc_rest_user_endpoint_handler($request = null) {
      $response = array();
      $parameters = $request->get_json_params();
      $username = sanitize_text_field($parameters['username']);
      $email = sanitize_text_field($parameters['email']);
      $firstname = sanitize_text_field($parameters['first_name']);
      $lastname = sanitize_text_field($parameters['last_name']);
      $password = sanitize_text_field($parameters['password']);
    
        
      // $role = sanitize_text_field($parameters['role']);
      $error = new WP_Error();
      if (empty($username)) {
        $error->add(400, __("Username field 'username' is required.", 'wp-rest-user'), array('status' => 400));
        return $error;
      }
      if (empty($email)) {
        $error->add(401, __("Email field 'email' is required.", 'wp-rest-user'), array('status' => 400));
        return $error;
      }
      if (empty($password)) {
        $error->add(404, __("Password field 'password' is required.", 'wp-rest-user'), array('status' => 400));
        return $error;
      }

  $user_id = username_exists($username);
  if (!$user_id && email_exists($email) == false) {
    $user_id = wp_create_user($username, $password, $email, $firstname, $lastname);
    if (!is_wp_error($user_id)) {
      // Ger User Meta Data (Sensitive, Password included. DO NOT pass to front end.)
      $user = get_user_by('id', $user_id);
      // $user->set_role($role);
      $user->set_role('subscriber');
      // WooCommerce specific code
      if (class_exists('WooCommerce')) {
        $user->set_role('customer');
      }
      // Ger User Data (Non-Sensitive, Pass to front end.)
      $response['code'] = 200;
      $response['message'] = __("User '" . $username . "' Registration was Successful", "wp-rest-user");
    } else {
      return $user_id;
    }
  } else {
    $error->add(406, __("Email already exists, please try 'Reset Password'", 'wp-rest-user'), array('status' => 400));
    return $error;
  }
  return new WP_REST_Response($response, 123);
}

    

Solution

  • The wp_create_user() function does not have a last name or first name parameter.

    wp_create_user( string $username, string $password, string $email = '' )
    

    To set the names, you need to update the user meta:

    update_user_meta( $user_id, 'first_name', $firstname );
    update_user_meta( $user_id, 'last_name', $lastname );
    

    Or use the wp_insert_user() function:

    $user_id = wp_insert_user( array(
        'user_login' => $username,
        'user_email' => $email,
        'user_pass'  => $password,
        'first_name' => $firstname,
        'last_name'  => $lastname,
    ) );