Skip to content

Commit 67c4021

Browse files
authored
Merge pull request #20 from felixarntz/master
2 parents ca9c604 + e00c8ce commit 67c4021

File tree

2 files changed

+151
-14
lines changed

2 files changed

+151
-14
lines changed

features/super-admin.feature

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ Feature: Manage super admins associated with a multisite instance
22

33
Scenario: Add, list, and remove super admins.
44
Given a WP multisite installation
5+
56
When I run `wp user create superadmin superadmin@example.com`
67
And I run `wp super-admin list`
78
Then STDOUT should be:
@@ -232,3 +233,103 @@ Feature: Manage super admins associated with a multisite instance
232233

233234
When I run `wp super-admin list`
234235
Then STDERR should be empty
236+
237+
Scenario: Hooks should be firing as expected
238+
Given a WP multisite installation
239+
And a wp-content/mu-plugins/test-hooks.php file:
240+
"""
241+
<?php
242+
add_action( 'grant_super_admin', static function () {
243+
WP_CLI::log( 'grant_super_admin hook was fired.' );
244+
});
245+
add_action( 'granted_super_admin', static function () {
246+
WP_CLI::log( 'granted_super_admin hook was fired.' );
247+
});
248+
add_action( 'revoke_super_admin', static function () {
249+
WP_CLI::log( 'revoke_super_admin hook was fired.' );
250+
});
251+
add_action( 'revoked_super_admin', static function () {
252+
WP_CLI::log( 'revoked_super_admin hook was fired.' );
253+
});
254+
"""
255+
256+
When I run `wp user create superadmin superadmin@example.com`
257+
And I run `wp super-admin add superadmin`
258+
Then STDOUT should contain:
259+
"""
260+
grant_super_admin hook was fired.
261+
"""
262+
And STDOUT should contain:
263+
"""
264+
granted_super_admin hook was fired.
265+
"""
266+
267+
When I try `wp super-admin add superadmin`
268+
Then STDOUT should contain:
269+
"""
270+
grant_super_admin hook was fired.
271+
"""
272+
And STDOUT should not contain:
273+
"""
274+
granted_super_admin hook was fired.
275+
"""
276+
277+
When I run `wp super-admin remove admin`
278+
Then STDOUT should contain:
279+
"""
280+
revoke_super_admin hook was fired.
281+
"""
282+
And STDOUT should contain:
283+
"""
284+
revoked_super_admin hook was fired.
285+
"""
286+
287+
When I try `wp super-admin add noadmin`
288+
Then STDOUT should not contain:
289+
"""
290+
grant_super_admin hook was fired.
291+
"""
292+
And STDOUT should not contain:
293+
"""
294+
granted_super_admin hook was fired.
295+
"""
296+
297+
When I try `wp super-admin add admin noadmin`
298+
Then STDOUT should contain:
299+
"""
300+
grant_super_admin hook was fired.
301+
"""
302+
And STDOUT should not contain:
303+
"""
304+
granted_super_admin hook was fired.
305+
"""
306+
307+
When I try `wp super-admin remove noadmin`
308+
Then STDOUT should not contain:
309+
"""
310+
revoke_super_admin hook was fired.
311+
"""
312+
And STDOUT should not contain:
313+
"""
314+
revoked_super_admin hook was fired.
315+
"""
316+
317+
When I try `wp super-admin remove admin admin@example.com noadmin superadmin`
318+
Then STDOUT should contain:
319+
"""
320+
revoke_super_admin hook was fired.
321+
"""
322+
And STDOUT should contain:
323+
"""
324+
revoked_super_admin hook was fired.
325+
"""
326+
327+
When I try `wp super-admin remove superadmin`
328+
Then STDOUT should contain:
329+
"""
330+
revoke_super_admin hook was fired.
331+
"""
332+
And STDOUT should not contain:
333+
"""
334+
revoked_super_admin hook was fired.
335+
"""

src/Super_Admin_Command.php

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<?php
2+
23
use WP_CLI\Fetchers\User as UserFetcher;
34

45
/**
@@ -23,9 +24,9 @@
2324
*/
2425
class 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

Comments
 (0)