diff --git a/README.md b/README.md index d52b3b5c1..443b4e98c 100644 --- a/README.md +++ b/README.md @@ -4637,7 +4637,7 @@ wp user add-cap Adds a role for a user. ~~~ -wp user add-role +wp user add-role [...] ~~~ **OPTIONS** @@ -4645,14 +4645,17 @@ wp user add-role User ID, user email, or user login. - - Add the specified role to the user. + [...] + Add the specified role(s) to the user. **EXAMPLES** $ wp user add-role 12 author Success: Added 'author' role for johndoe (12). + $ wp user add-role 12 author editor + Success: Added 'author', 'editor' roles for johndoe (12). + ### wp user create @@ -5357,7 +5360,7 @@ wp user remove-cap Removes a user's role. ~~~ -wp user remove-role [] +wp user remove-role [...] ~~~ **OPTIONS** @@ -5365,14 +5368,17 @@ wp user remove-role [] User ID, user email, or user login. - [] - A specific role to remove. + [...] + Remove the specified role(s) from the user. **EXAMPLES** $ wp user remove-role 12 author Success: Removed 'author' role for johndoe (12). + $ wp user remove-role 12 author editor + Success: Removed 'author', 'editor' roles for johndoe (12). + ### wp user reset-password diff --git a/features/user.feature b/features/user.feature index 3537f0899..53d380a4d 100644 --- a/features/user.feature +++ b/features/user.feature @@ -209,14 +209,50 @@ Feature: Manage WordPress users Scenario: Managing user roles Given a WP install + When I try `wp user add-role 1` + Then the return code should be 1 + And STDERR should be: + """ + Error: Please specify at least one role to add. + """ + And STDOUT should be empty + When I run `wp user add-role 1 editor` - Then STDOUT should not be empty - And I run `wp user get 1 --field=roles` + Then STDOUT should be: + """ + Success: Added 'editor' role for admin (1). + """ + + When I run `wp user get 1 --field=roles` Then STDOUT should be: """ administrator, editor """ + When I run `wp user add-role 1 editor contributor` + Then STDOUT should be: + """ + Success: Added 'editor', 'contributor' roles for admin (1). + """ + + When I run `wp user get 1 --field=roles` + Then STDOUT should be: + """ + administrator, editor, contributor + """ + + When I run `wp user remove-role 1 editor contributor` + Then STDOUT should be: + """ + Success: Removed 'editor', 'contributor' roles from admin (1). + """ + + When I run `wp user get 1 --field=roles` + Then STDOUT should be: + """ + administrator + """ + When I try `wp user add-role 1 edit` Then STDERR should contain: """ diff --git a/src/User_Command.php b/src/User_Command.php index e0fbd867c..defd6b304 100644 --- a/src/User_Command.php +++ b/src/User_Command.php @@ -692,26 +692,39 @@ public function set_role( $args, $assoc_args ) { * * : User ID, user email, or user login. * - * - * : Add the specified role to the user. + * [...] + * : Add the specified role(s) to the user. * * ## EXAMPLES * * $ wp user add-role 12 author * Success: Added 'author' role for johndoe (12). * + * $ wp user add-role 12 author editor + * Success: Added 'author', 'editor' roles for johndoe (12). + * * @subcommand add-role */ public function add_role( $args, $assoc_args ) { $user = $this->fetcher->get_check( $args[0] ); - $role = $args[1]; + $roles = $args; + array_shift( $roles ); - self::validate_role( $role ); + if ( empty( $roles ) ) { + WP_CLI::error( 'Please specify at least one role to add.' ); + } - $user->add_role( $role ); + foreach ( $roles as $role ) { + self::validate_role( $role ); + } - WP_CLI::success( "Added '{$role}' role for {$user->user_login} ({$user->ID})." ); + foreach ( $roles as $role ) { + $user->add_role( $role ); + } + $message = implode( "', '", $roles ); + $label = count( $roles ) > 1 ? 'roles' : 'role'; + WP_CLI::success( "Added '{$message}' {$label} for {$user->user_login} ({$user->ID})." ); } /** @@ -722,27 +735,36 @@ public function add_role( $args, $assoc_args ) { * * : User ID, user email, or user login. * - * [] - * : A specific role to remove. + * [...] + * : Remove the specified role(s) from the user. * * ## EXAMPLES * * $ wp user remove-role 12 author * Success: Removed 'author' role for johndoe (12). * + * $ wp user remove-role 12 author editor + * Success: Removed 'author', 'editor' roles for johndoe (12). + * * @subcommand remove-role */ public function remove_role( $args, $assoc_args ) { $user = $this->fetcher->get_check( $args[0] ); if ( isset( $args[1] ) ) { - $role = $args[1]; - - self::validate_role( $role ); + $roles = $args; + array_shift( $roles ); - $user->remove_role( $role ); + foreach ( $roles as $role ) { + self::validate_role( $role ); + } - WP_CLI::success( "Removed '{$role}' role for {$user->user_login} ({$user->ID})." ); + foreach ( $roles as $role ) { + $user->remove_role( $role ); + } + $message = implode( "', '", $roles ); + $label = count( $roles ) > 1 ? 'roles' : 'role'; + WP_CLI::success( "Removed '{$message}' {$label} from {$user->user_login} ({$user->ID})." ); } else { // Multisite if ( function_exists( 'remove_user_from_blog' ) ) {