How to create a new user programmatically in wordpress

Creating a new user programmatically in WordPress can be accomplished using the built-in wp_create_user() function or by directly interacting with the database using wpdb. Both methods have their use cases and benefits. Let’s explore each method with concise explanations.

Method 1: Using wp_create_user()

Code Example

function wpexpertguide_create_new_user() {
    $username = 'newuser';
    $password = 'password123';
    $email = 'newuser@example.com';

    if (username_exists($username) || email_exists($email)) {
        return 'User already exists.';
    }

    $user_id = wp_create_user($username, $password, $email);

    if (is_wp_error($user_id)) {
        return $user_id->get_error_message();
    }

    $user = new WP_User($user_id);
    $user->set_role('subscriber');

    return 'User created successfully!';
}

add_action('init', 'wpexpertguide_create_new_user');

Explanation

  • User Data: Defines username, password, and email.
  • Check Existing User: Ensures the username or email doesn’t already exist.
  • Create User: Uses wp_create_user() which hashes the password and saves the user.
  • Set Role: Assigns the ‘subscriber’ role to the new user.
  • Hook Function: Executes the function during the init action.

Method 2: Using wpdb for Direct Database Interaction

Code Example 1

function wpexpertguide_create_new_user_via_wpdb() {
  global $wpdb;

  // User data
  $user_login = 'newuser';
  $user_email = 'newuser@example.com';
  $user_nicename = 'New User';
  $display_name = 'New User';

  // Check if user already exists
  if (username_exists($user_login) || email_exists($user_email)) {
      return 'User already exists.';
  }

  // Generate a random password and hash it
  $random_password = wp_generate_password();
  $hashed_password = wp_hash_password($random_password);
  
  // Current time
  $now = current_time('mysql');

  // Insert user into wp_users table
  $wpdb->insert(
      $wpdb->users,
      array(
          'user_login' => $user_login,
          'user_pass' => $hashed_password,
          'user_nicename' => $user_nicename,
          'user_email' => $user_email,
          'user_registered' => $now,
          'display_name' => $display_name,
      ),
      array('%s', '%s', '%s', '%s', '%s', '%s')
  );
  
  // Get the newly inserted user's ID
  $user_id = $wpdb->insert_id;

  if ($user_id) {
      // User role data
      $role = serialize(array('subscriber' => true));

      // Insert user meta data
      $meta_values = array(
          array('user_id' => $user_id, 'meta_key' => $wpdb->prefix . 'capabilities', 'meta_value' => $role),
          array('user_id' => $user_id, 'meta_key' => 'nickname', 'meta_value' => $user_nicename),
          array('user_id' => $user_id, 'meta_key' => 'first_name', 'meta_value' => 'New'),
          array('user_id' => $user_id, 'meta_key' => 'last_name', 'meta_value' => 'User'),
          array('user_id' => $user_id, 'meta_key' => $wpdb->prefix . 'user_level', 'meta_value' => 0),
      );

      foreach ($meta_values as $meta) {
          $wpdb->insert($wpdb->usermeta, $meta, array('%d', '%s', '%s'));
      }

      return 'User created successfully!';
  }

  return 'Failed to create user.';
}

add_action('init', 'wpexpertguide_create_new_user_via_wpdb');

Code Example 2(Using Custom wpdb Instance)

This method demonstrates how to create a new user programmatically in WordPress by directly interacting with the database using a custom wpdb instance. This is particularly useful when you need to work with multiple databases or have specific database connection requirements.

function wpexpertguide_create_new_user_via_wpdb() {
    global $wpdb;

    $main_domain_db = new wpdb('username', 'password', 'database', 'localhost'); //replace these accordingly
    $users_table = $wpdb->prefix . "users";
    $user_meta_table = $wpdb->prefix . "usermeta";

    $user_login = 'newuser';
    $user_email = 'newuser@example.com';
    $user_nicename = 'New User';
    $display_name = 'New User';
    $now = current_time('mysql');

    // Check if the user already exists
    $user_exists = $main_domain_db->get_var($main_domain_db->prepare(
        "SELECT ID FROM {$users_table} WHERE user_login = %s OR user_email = %s",
        $user_login, $user_email
    ));

    if ($user_exists) {
        return 'User already exists.';
    }

    // Generate a random password and hash it
    $random = wp_generate_password();
    $password = wp_hash_password($random);

    // Insert user into wp_users table
    $main_domain_db->insert(
        $users_table,
        array(
            'user_login' => $user_login,
            'user_pass' => $password,
            'user_nicename' => $user_nicename,
            'user_email' => $user_email,
            'user_registered' => $now,
            'display_name' => $display_name,
        ),
        array('%s', '%s', '%s', '%s', '%s', '%s')
    );

    $user_id = $main_domain_db->insert_id;

    if ($user_id) {
        $role = serialize(array('subscriber' => true));
        $meta_values = array(
            array('user_id' => $user_id, 'meta_key' => $wpdb->prefix . 'capabilities', 'meta_value' => $role),
            array('user_id' => $user_id, 'meta_key' => 'nickname', 'meta_value' => $user_nicename),
            array('user_id' => $user_id, 'meta_key' => 'first_name', 'meta_value' => 'New'),
            array('user_id' => $user_id, 'meta_key' => 'last_name', 'meta_value' => 'User'),
            array('user_id' => $user_id, 'meta_key' => $wpdb->prefix . 'user_level', 'meta_value' => 0),
        );

        foreach ($meta_values as $meta) {
            $main_domain_db->insert($user_meta_table, $meta, array('%d', '%s', '%s'));
        }

        return 'User created successfully!';
    }

    return 'Failed to create user.';
}

add_action('init', 'wpexpertguide_create_new_user_via_wpdb');

Explanation

  • Generate Password: Creates a random password and hashes it using wp_hash_password().
  • Insert User: Directly inserts user data into the wp_users table.
  • User Meta: Inserts additional user meta information into the wp_usermeta table.
  • Hook Function: Executes the function during the init action. You can remove that and call the function according to your need.

Advantages and Considerations

  1. wp_create_user() Method:
    • Advantages: Simplifies user creation, automatically handles password hashing and ensures all necessary user meta data is created.
    • Considerations: Limited customization during user creation. Relies on WordPress core functions for everything.
  2. wpdb Method:
    • Advantages: Provides full control over the data insertion process. Useful for complex scenarios or when interacting with multiple databases.
    • Considerations: Requires careful handling of data to ensure security (e.g. proper password hashing). More prone to errors if not handled correctly.

Tip: Adding Multiple Users Programmatically

Loop Through User Data

If you have multiple users to add you can loop through an array of user data and insert each user within the loop. This approach allows you to efficiently add multiple users with a single script.

Example Code

Here’s how you can modify the existing script to add multiple users:

function wpexpertguide_create_multiple_users_via_wpdb() {
  global $wpdb;

  $main_domain_db = new wpdb('username', 'password', 'database', 'localhost'); //replace these accordingly
  $users_table = $wpdb->prefix . "users";
  $user_meta_table = $wpdb->prefix . "usermeta";

  // Array of users to be created
  $users_to_create = array(
      array(
          'user_login' => 'user1',
          'user_email' => 'user1@example.com',
          'user_nicename' => 'User One',
          'display_name' => 'User One',
      ),
      array(
          'user_login' => 'user2',
          'user_email' => 'user2@example.com',
          'user_nicename' => 'User Two',
          'display_name' => 'User Two',
      ),
      // Add more users as needed
  );

  foreach ($users_to_create as $user_data) {
      // Extract user data
      $user_login = $user_data['user_login'];
      $user_email = $user_data['user_email'];
      $user_nicename = $user_data['user_nicename'];
      $display_name = $user_data['display_name'];
      $now = current_time('mysql');

      // Check if the user already exists
      $user_exists = $main_domain_db->get_var($main_domain_db->prepare(
          "SELECT ID FROM {$users_table} WHERE user_login = %s OR user_email = %s",
          $user_login, $user_email
      ));

      if ($user_exists) {
          continue; // Skip creating this user if they already exist
      }

      // Generate a random password and hash it
      $random = wp_generate_password();
      $password = wp_hash_password($random);

      // Insert user into wp_users table
      $main_domain_db->insert(
          $users_table,
          array(
              'user_login' => $user_login,
              'user_pass' => $password,
              'user_nicename' => $user_nicename,
              'user_email' => $user_email,
              'user_registered' => $now,
              'display_name' => $display_name,
          ),
          array('%s', '%s', '%s', '%s', '%s', '%s')
      );

      $user_id = $main_domain_db->insert_id;

      if ($user_id) {
          $role = serialize(array('subscriber' => true));
          $meta_values = array(
              array('user_id' => $user_id, 'meta_key' => $wpdb->prefix . 'capabilities', 'meta_value' => $role),
              array('user_id' => $user_id, 'meta_key' => 'nickname', 'meta_value' => $user_nicename),
              array('user_id' => $user_id, 'meta_key' => 'first_name', 'meta_value' => 'User'),
              array('user_id' => $user_id, 'meta_key' => 'last_name', 'meta_value' => 'One'), // Adjust as needed
              array('user_id' => $user_id, 'meta_key' => $wpdb->prefix . 'user_level', 'meta_value' => 0),
          );

          foreach ($meta_values as $meta) {
              $main_domain_db->insert($user_meta_table, $meta, array('%d', '%s', '%s'));
          }
      }
  }

  return 'Users created successfully!';
}

add_action('init', 'wpexpertguide_create_multiple_users_via_wpdb');

Both methods are useful depending on your requirements. The wp_create_user() function is simpler and ensures compliance with WordPress standards, while the wpdb method offers more control and flexibility.

Additional Tips

  1. Data Validation: Ensure that the user data array is validated before attempting to insert users into the database. This helps avoid errors and inconsistencies.
  2. Error Handling: Implement proper error handling within the loop to log or report any issues that occur during the user creation process. This can help you identify and fix problems more quickly.
  3. Batch Processing: If you have a large number of users to add, consider breaking them into smaller batches to avoid potential performance issues or timeouts.
  4. Sending Emails: The example includes sending an email to each new user with their login details. Customize the email content as needed and ensure that your WordPress installation is properly configured to send emails.
  5. Role Assignment: The example assigns the ‘subscriber’ role to each new user. Modify this as needed based on your specific requirements.

Conclusion

The custom wpdb instance method offers greater control and flexibility compared to the built-in wp_create_user() function or the default wpdb instance. It is particularly useful when you need to interact with multiple databases or have specific database connection requirements. Choose this method if you need fine-grained control over the database operations during user creation.

Leave a Reply

Your email address will not be published. Required fields are marked *