8 class User_Command extends \WP_CLI\CommandWithDBObject {
10 protected $obj_type = 'user';
11 protected $obj_fields = array(
20 public function __construct() {
21 $this->fetcher = new \WP_CLI\Fetchers\User;
30 * : Only display users with a certain role.
33 * : Filter by one or more fields. For accepted fields, see get_users().
36 * : Prints the value of a single field for each user.
39 * : Limit the output to specific object fields. Defaults to ID,user_login,display_name,user_email,user_registered,roles
42 * : Accepted values: table, csv, json, count. Default: table
46 * wp user list --field=ID
48 * wp user list --role=administrator --format=csv
50 * wp user list --fields=display_name,user_email --format=json
54 public function _list( $args, $assoc_args ) {
55 $formatter = $this->get_formatter( $assoc_args );
57 if ( 'ids' == $formatter->format ) {
58 $assoc_args['fields'] = 'ids';
60 $assoc_args['fields'] = 'all_with_meta';
63 $users = get_users( $assoc_args );
65 $it = WP_CLI\Utils\iterator_map( $users, function ( $user ) {
66 if ( !is_object( $user ) )
69 $user->roles = implode( ',', $user->roles );
74 $formatter->display_items( $it );
83 * : User ID or user login.
86 * : Instead of returning the whole user, returns the value of a single field.
89 * : Accepted values: table, json. Default: table
93 * wp user get 12 --field=login
95 * wp user get bob --format=json > bob.json
97 public function get( $args, $assoc_args ) {
98 $user = $this->fetcher->get_check( $args[0] );
100 if ( method_exists( $user, 'to_array' ) ) {
101 $user_data = $user->to_array();
104 $user_data = (array) $user->data;
106 $user_data['roles'] = implode( ', ', $user->roles );
108 $formatter = $this->get_formatter( $assoc_args );
109 $formatter->display_item( $user_data );
113 * Delete one or more users.
118 * : The user login or ID of the user(s) to update.
120 * [--reassign=<user-id>]
121 * : User ID to reassign the posts to.
125 * wp user delete 123 --reassign=567
127 public function delete( $args, $assoc_args ) {
128 $assoc_args = wp_parse_args( $assoc_args, array(
132 $users = $this->fetcher->get_many( $args );
134 parent::_delete( $users, $assoc_args, function ( $user, $assoc_args ) {
135 $user_id = $user->ID;
137 if ( is_multisite() ) {
138 $r = wpmu_delete_user( $user_id );
140 $r = wp_delete_user( $user_id, $assoc_args['reassign'] );
144 return array( 'success', "Deleted user $user_id." );
146 return array( 'error', "Failed deleting user $user_id." );
157 * : The login of the user to create.
160 * : The email address of the user to create.
163 * : The role of the user to create. Default: default role
165 * [--user_pass=<password>]
166 * : The user password. Default: randomly generated
168 * [--user_registered=<yyyy-mm-dd>]
169 * : The date the user registered. Default: current date
171 * [--display_name=<name>]
172 * : The display name.
175 * : Output just the new user id.
179 * wp user create bob bob@example.com --role=author
181 public function create( $args, $assoc_args ) {
182 list( $user_login, $user_email ) = $args;
185 'role' => get_option('default_role'),
186 'user_pass' => false,
187 'user_registered' => strftime( "%F %T", time() ),
188 'display_name' => false,
190 extract( array_merge( $defaults, $assoc_args ), EXTR_SKIP );
192 if ( !self::validate_role( $role ) ) {
193 WP_CLI::error( "Invalid role: $role" );
196 // @codingStandardsIgnoreStart
198 $user_pass = wp_generate_password();
199 $generated_pass = true;
202 $user_id = wp_insert_user( array(
203 'user_email' => $user_email,
204 'user_login' => $user_login,
205 'user_pass' => $user_pass,
206 'user_registered' => $user_registered,
207 'display_name' => $display_name,
211 if ( is_wp_error( $user_id ) ) {
212 WP_CLI::error( $user_id );
214 if ( false === $role ) {
215 delete_user_option( $user_id, 'capabilities' );
216 delete_user_option( $user_id, 'user_level' );
220 if ( isset( $assoc_args['porcelain'] ) ) {
221 WP_CLI::line( $user_id );
223 WP_CLI::success( "Created user $user_id." );
224 if ( isset( $generated_pass ) )
225 WP_CLI::line( "Password: $user_pass" );
227 // @codingStandardsIgnoreEnd
236 * : The user login or ID of the user(s) to update.
239 * : One or more fields to update. For accepted fields, see wp_update_user().
243 * wp user update 123 --user_login=mary --display_name=Mary
245 * wp user update mary --user_pass=marypass
247 public function update( $args, $assoc_args ) {
250 foreach ( $this->fetcher->get_many( $args ) as $user ) {
251 $user_ids[] = $user->ID;
254 parent::_update( $user_ids, $assoc_args, 'wp_update_user' );
263 * : How many users to generate. Default: 100
266 * : The role of the generated users. Default: default role from WP
268 public function generate( $args, $assoc_args ) {
273 'role' => get_option('default_role'),
275 $assoc_args = array_merge( $defaults, $assoc_args );
277 if ( !self::validate_role( $assoc_args['role'] ) ) {
278 WP_CLI::error( "Invalid role: $role" );
281 $user_count = count_users();
282 $total = $user_count['total_users'];
283 $limit = $assoc_args['count'] + $total;
285 $notify = \WP_CLI\Utils\make_progress_bar( 'Generating users', $assoc_args['count'] );
287 for ( $i = $total; $i < $limit; $i++ ) {
288 $login = sprintf( 'user_%d_%d', $blog_id, $i );
291 $user_id = wp_insert_user( array(
292 'user_login' => $login,
293 'user_pass' => $login,
295 'display_name' => $name,
299 if ( false === $role ) {
300 delete_user_option( $user_id, 'capabilities' );
301 delete_user_option( $user_id, 'user_level' );
311 * Set the user role (for a particular blog).
316 * : User ID or user login.
319 * : Make the user have the specified role. If not passed, the default role is
324 * wp user set-role bob author
325 * wp user set-role 12 author
327 * @subcommand set-role
329 public function set_role( $args, $assoc_args ) {
330 $user = $this->fetcher->get_check( $args[0] );
332 $role = isset( $args[1] ) ? $args[1] : get_option( 'default_role' );
335 if ( function_exists( 'add_user_to_blog' ) )
336 add_user_to_blog( get_current_blog_id(), $user->ID, $role );
338 $user->set_role( $role );
340 WP_CLI::success( "Added {$user->user_login} ({$user->ID}) to " . site_url() . " as {$role}" );
344 * Add a role for a user.
349 * : User ID or user login.
352 * : Add the specified role to the user.
356 * wp user add-role bob author
357 * wp user add-role 12 author
359 * @subcommand add-role
361 public function add_role( $args, $assoc_args ) {
362 $user = $this->fetcher->get_check( $args[0] );
366 $user->add_role( $role );
368 WP_CLI::success( sprintf( "Added '%s' role for %s (%d).", $role, $user->user_login, $user->ID ) );
372 * Remove a user's role.
377 * : User ID or user login.
380 * : A specific role to remove.
384 * wp user remove-role bob
385 * wp user remove-role 12 editor
387 * @subcommand remove-role
389 public function remove_role( $args, $assoc_args ) {
390 $user = $this->fetcher->get_check( $args[0] );
392 if ( isset( $args[1] ) ) {
395 $user->remove_role( $role );
397 WP_CLI::success( sprintf( "Removed '%s' role for %s (%d).", $role, $user->user_login, $user->ID ) );
400 if ( function_exists( 'remove_user_from_blog' ) )
401 remove_user_from_blog( $user->ID, get_current_blog_id() );
403 $user->remove_all_caps();
405 WP_CLI::success( "Removed {$user->user_login} ({$user->ID}) from " . site_url() );
410 * Add a capability for a user.
415 * : User ID or user login.
418 * : The capability to add.
422 * wp user add-cap john create_premium_item
423 * wp user add-cap 15 edit_product
425 * @subcommand add-cap
427 public function add_cap( $args, $assoc_args ) {
428 $user = $this->fetcher->get_check( $args[0] );
431 $user->add_cap( $cap );
433 WP_CLI::success( sprintf( "Added '%s' capability for %s (%d).", $cap, $user->user_login, $user->ID ) );
438 * Remove a user's capability.
443 * : User ID or user login.
446 * : The capability to be removed.
450 * wp user remove-cap bob edit_themes
451 * wp user remove-cap 11 publish_newsletters
453 * @subcommand remove-cap
455 public function remove_cap( $args, $assoc_args ) {
456 $user = $this->fetcher->get_check( $args[0] );
459 $user->remove_cap( $cap );
461 WP_CLI::success( sprintf( "Removed '%s' cap for %s (%d).", $cap, $user->user_login, $user->ID ) );
466 * List all user's capabilities.
471 * : User ID or login.
475 * wp user list-caps admin
476 * wp user list-caps 21
478 * @subcommand list-caps
480 public function list_caps( $args, $assoc_args ) {
481 $user = $this->fetcher->get_check( $args[0] );
484 $user->get_role_caps();
486 $user_caps_list = $user->allcaps;
487 $cap_table_titles = array( 'capability', 'status' );
489 foreach ( $user_caps_list as $cap => $active ) {
498 * Import users from a CSV file.
503 * : The CSV file of users to import.
507 * wp user import-csv /path/to/users.csv
509 * Sample users.csv file:
511 * user_login,user_email,display_name,role
512 * bobjones,bobjones@domain.com,Bob Jones,contributor
513 * newuser1,newuser1@domain.com,New User,author
514 * existinguser,existinguser@domain.com,Existing User,administrator
516 * @subcommand import-csv
518 public function import_csv( $args, $assoc_args ) {
520 $blog_users = get_users();
522 $filename = $args[0];
524 if ( ! file_exists( $filename ) ) {
525 WP_CLI::warning( sprintf( "Missing file: %s", $filename ) );
528 foreach ( new \WP_CLI\Iterators\CSV( $filename ) as $i => $new_user ) {
530 'role' => get_option('default_role'),
531 'user_pass' => wp_generate_password(),
532 'user_registered' => strftime( "%F %T", time() ),
533 'display_name' => false,
535 $new_user = array_merge( $defaults, $new_user );
537 if ( 'none' === $new_user['role'] ) {
538 $new_user['role'] = false;
539 } elseif ( is_null( get_role( $new_user['role'] ) ) ) {
540 WP_CLI::warning( "{$new_user['user_login']} has an invalid role" );
544 // User already exists and we just need to add them to the site if they aren't already there
545 $existing_user = get_user_by( 'email', $new_user['user_email'] );
547 if ( !$existing_user ) {
548 $existing_user = get_user_by( 'login', $new_user['user_login'] );
551 if ( $existing_user ) {
552 $new_user['ID'] = $existing_user->ID;
553 $user_id = wp_update_user( $new_user );
555 if ( !in_array( $existing_user->user_login, wp_list_pluck( $blog_users, 'user_login' ) ) && $new_user['role'] ) {
556 add_user_to_blog( get_current_blog_id(), $existing_user->ID, $new_user['role'] );
557 WP_CLI::log( "{$existing_user->user_login} added as {$new_user['role']}." );
562 $user_id = wp_insert_user( $new_user );
565 if ( is_wp_error( $user_id ) ) {
566 WP_CLI::warning( $user_id );
569 } else if ( $new_user['role'] === false ) {
570 delete_user_option( $user_id, 'capabilities' );
571 delete_user_option( $user_id, 'user_level' );
574 if ( !empty( $existing_user ) ) {
575 WP_CLI::success( $new_user['user_login'] . " updated" );
577 WP_CLI::success( $new_user['user_login'] . " created" );
582 private static function validate_role( $role ) {
583 if ( empty( $role ) || ! is_null( get_role( $role ) ) ) {
590 WP_CLI::add_command( 'user', 'User_Command' );