11<?php
2+
23use WP_CLI \Fetchers \User as UserFetcher ;
34
45/**
2324 */
2425class Super_Admin_Command extends WP_CLI_Command {
2526
26- private $ fields = array (
27+ private $ fields = [
2728 'user_login ' ,
28- ) ;
29+ ] ;
2930
3031 public function __construct () {
3132 $ this ->fetcher = new UserFetcher ();
@@ -66,7 +67,7 @@ public function list_subcommand( $_, $assoc_args ) {
6667 WP_CLI ::line ( $ user_login );
6768 }
6869 } else {
69- $ output_users = array () ;
70+ $ output_users = [] ;
7071 foreach ( $ super_admins as $ user_login ) {
7172 $ output_user = new stdClass ();
7273
@@ -97,20 +98,25 @@ public function add( $args, $_ ) {
9798 $ successes = 0 ;
9899 $ errors = 0 ;
99100 $ users = $ this ->fetcher ->get_many ( $ args );
101+
100102 if ( count ( $ users ) !== count ( $ args ) ) {
101103 $ errors = count ( $ args ) - count ( $ users );
102104 }
103- $ user_logins = wp_list_pluck ( $ users , ' user_login ' );
105+
104106 $ super_admins = self ::get_admins ();
105107 $ num_super_admins = count ( $ super_admins );
106108
107- foreach ( $ user_logins as $ user_login ) {
108- if ( in_array ( $ user_login , $ super_admins , true ) ) {
109- WP_CLI ::warning ( "User ' {$ user_login }' already has super-admin capabilities. " );
109+ $ new_super_admins = [];
110+ foreach ( $ users as $ user ) {
111+ do_action ( 'grant_super_admin ' , (int ) $ user ->ID ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
112+
113+ if ( in_array ( $ user ->user_login , $ super_admins , true ) ) {
114+ WP_CLI ::warning ( "User ' {$ user ->user_login }' already has super-admin capabilities. " );
110115 continue ;
111116 }
112117
113- $ super_admins [] = $ user_login ;
118+ $ new_super_admins [] = $ user ->ID ;
119+ $ super_admins [] = $ user ->user_login ;
114120 $ successes ++;
115121 }
116122
@@ -134,6 +140,10 @@ public function add( $args, $_ ) {
134140 WP_CLI ::error ( 'Site options update failed. ' );
135141 }
136142 }
143+
144+ foreach ( $ new_super_admins as $ user_id ) {
145+ do_action ( 'granted_super_admin ' , (int ) $ user_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
146+ }
137147 }
138148
139149 /**
@@ -150,15 +160,22 @@ public function add( $args, $_ ) {
150160 * Success: Revoked super-admin capabilities.
151161 */
152162 public function remove ( $ args , $ _ ) {
163+ $ users = $ this ->fetcher ->get_many ( $ args );
164+ $ user_logins = $ users ? array_values ( array_unique ( wp_list_pluck ( $ users , 'user_login ' ) ) ) : [];
165+ $ user_logins_count = count ( $ user_logins );
166+
167+ $ user_ids = [];
168+ foreach ( $ users as $ user ) {
169+ $ user_ids [ $ user ->user_login ] = $ user ->ID ;
170+
171+ do_action ( 'revoke_super_admin ' , (int ) $ user ->ID ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
172+ }
173+
153174 $ super_admins = self ::get_admins ();
154175 if ( ! $ super_admins ) {
155176 WP_CLI ::error ( 'No super admins to revoke super-admin privileges from. ' );
156177 }
157178
158- $ users = $ this ->fetcher ->get_many ( $ args );
159- $ user_logins = $ users ? array_values ( array_unique ( wp_list_pluck ( $ users , 'user_login ' ) ) ) : array ();
160- $ user_logins_count = count ( $ user_logins );
161-
162179 if ( $ user_logins_count < count ( $ args ) ) {
163180 $ flipped_user_logins = array_flip ( $ user_logins );
164181 // Fetcher has already warned so don't bother here, but continue with any args that are possible login names to cater for invalid users in the site options meta.
@@ -168,7 +185,7 @@ public function remove( $args, $_ ) {
168185 array_unique (
169186 array_filter (
170187 $ args ,
171- function ( $ v ) use ( $ flipped_user_logins ) {
188+ static function ( $ v ) use ( $ flipped_user_logins ) {
172189 // Exclude numeric and email-like logins (login names can be email-like but ignore this given the circumstances).
173190 return ! isset ( $ flipped_user_logins [ $ v ] ) && ! is_numeric ( $ v ) && ! is_email ( $ v );
174191 }
@@ -199,10 +216,29 @@ function ( $v ) use ( $flipped_user_logins ) {
199216 $ msg .= ' There are no remaining super admins. ' ;
200217 }
201218 WP_CLI ::success ( $ msg );
219+
220+ $ removed_logins = array_intersect ( $ user_logins , $ super_admins );
221+
222+ foreach ( $ removed_logins as $ user_login ) {
223+ $ user_id = null ;
224+
225+ if ( array_key_exists ( $ user_login , $ user_ids ) ) {
226+ $ user_id = $ user_ids [ $ user_login ];
227+ } else {
228+ $ user = get_user_by ( 'login ' , $ user_login );
229+ if ( $ user instanceof WP_User ) {
230+ $ user_id = $ user ->ID ;
231+ }
232+ }
233+
234+ if ( null !== $ user_id ) {
235+ do_action ( 'revoked_super_admin ' , (int ) $ user_ids [ $ user_login ] ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
236+ }
237+ }
202238 }
203239
204240 private static function get_admins () {
205241 // We don't use get_super_admins() because we don't want to mess with the global
206- return (array ) get_site_option ( 'site_admins ' , array ( 'admin ' ) );
242+ return (array ) get_site_option ( 'site_admins ' , [ 'admin ' ] );
207243 }
208244}
0 commit comments