Issues (4967)

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/wp-admin/users.php (4 issues)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * User administration panel
4
 *
5
 * @package WordPress
6
 * @subpackage Administration
7
 * @since 1.0.0
8
 */
9
10
/** WordPress Administration Bootstrap */
11
require_once( dirname( __FILE__ ) . '/admin.php' );
12
13
if ( ! current_user_can( 'list_users' ) ) {
14
	wp_die(
15
		'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .
16
		'<p>' . __( 'Sorry, you are not allowed to list users.' ) . '</p>',
17
		403
18
	);
19
}
20
21
$wp_list_table = _get_list_table('WP_Users_List_Table');
22
$pagenum = $wp_list_table->get_pagenum();
23
$title = __('Users');
24
$parent_file = 'users.php';
25
26
add_screen_option( 'per_page' );
27
28
// contextual help - choose Help on the top right of admin panel to preview this.
29
get_current_screen()->add_help_tab( array(
30
	'id'      => 'overview',
31
	'title'   => __('Overview'),
32
	'content' => '<p>' . __('This screen lists all the existing users for your site. Each user has one of five defined roles as set by the site admin: Site Administrator, Editor, Author, Contributor, or Subscriber. Users with roles other than Administrator will see fewer options in the dashboard navigation when they are logged in, based on their role.') . '</p>' .
33
				 '<p>' . __('To add a new user for your site, click the Add New button at the top of the screen or Add New in the Users menu section.') . '</p>'
34
) ) ;
35
36
get_current_screen()->add_help_tab( array(
37
	'id'      => 'screen-display',
38
	'title'   => __('Screen Display'),
39
	'content' => '<p>' . __('You can customize the display of this screen in a number of ways:') . '</p>' .
40
					'<ul>' .
41
					'<li>' . __('You can hide/display columns based on your needs and decide how many users to list per screen using the Screen Options tab.') . '</li>' .
42
					'<li>' . __( 'You can filter the list of users by User Role using the text links above the users list to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed.' ) . '</li>' .
43
					'<li>' . __('You can view all posts made by a user by clicking on the number under the Posts column.') . '</li>' .
44
					'</ul>'
45
) );
46
47
$help = '<p>' . __('Hovering over a row in the users list will display action links that allow you to manage users. You can perform the following actions:') . '</p>' .
48
	'<ul>' .
49
	'<li>' . __('Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username.') . '</li>';
50
51 View Code Duplication
if ( is_multisite() )
52
	$help .= '<li>' . __( 'Remove allows you to remove a user from your site. It does not delete their content. You can also remove multiple users at once by using Bulk Actions.' ) . '</li>';
53
else
54
	$help .= '<li>' . __( 'Delete brings you to the Delete Users screen for confirmation, where you can permanently remove a user from your site and delete their content. You can also delete multiple users at once by using Bulk Actions.' ) . '</li>';
55
56
$help .= '</ul>';
57
58
get_current_screen()->add_help_tab( array(
59
	'id'      => 'actions',
60
	'title'   => __('Actions'),
61
	'content' => $help,
62
) );
63
unset( $help );
64
65
get_current_screen()->set_help_sidebar(
66
    '<p><strong>' . __('For more information:') . '</strong></p>' .
67
    '<p>' . __('<a href="https://codex.wordpress.org/Users_Screen">Documentation on Managing Users</a>') . '</p>' .
68
    '<p>' . __('<a href="https://codex.wordpress.org/Roles_and_Capabilities">Descriptions of Roles and Capabilities</a>') . '</p>' .
69
    '<p>' . __('<a href="https://wordpress.org/support/">Support Forums</a>') . '</p>'
70
);
71
72
get_current_screen()->set_screen_reader_content( array(
73
	'heading_views'      => __( 'Filter users list' ),
74
	'heading_pagination' => __( 'Users list navigation' ),
75
	'heading_list'       => __( 'Users list' ),
76
) );
77
78
if ( empty($_REQUEST) ) {
79
	$referer = '<input type="hidden" name="wp_http_referer" value="'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) ) . '" />';
0 ignored issues
show
It seems like wp_unslash($_SERVER['REQUEST_URI']) targeting wp_unslash() can also be of type array; however, esc_attr() does only seem to accept string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
80
} elseif ( isset($_REQUEST['wp_http_referer']) ) {
81
	$redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), wp_unslash( $_REQUEST['wp_http_referer'] ) );
0 ignored issues
show
It seems like wp_unslash($_REQUEST['wp_http_referer']) targeting wp_unslash() can also be of type array; however, remove_query_arg() does only seem to accept boolean|string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
82
	$referer = '<input type="hidden" name="wp_http_referer" value="' . esc_attr($redirect) . '" />';
83
} else {
84
	$redirect = 'users.php';
85
	$referer = '';
86
}
87
88
$update = '';
89
90
switch ( $wp_list_table->current_action() ) {
91
92
/* Bulk Dropdown menu Role changes */
93
case 'promote':
94
	check_admin_referer('bulk-users');
95
96
	if ( ! current_user_can( 'promote_users' ) )
97
		wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
98
99
	if ( empty($_REQUEST['users']) ) {
100
		wp_redirect($redirect);
101
		exit();
102
	}
103
104
	$editable_roles = get_editable_roles();
105
	$role = false;
106 View Code Duplication
	if ( ! empty( $_REQUEST['new_role2'] ) ) {
107
		$role = $_REQUEST['new_role2'];
108
	} elseif ( ! empty( $_REQUEST['new_role'] ) ) {
109
		$role = $_REQUEST['new_role'];
110
	}
111
112
	if ( ! $role || empty( $editable_roles[ $role ] ) ) {
113
		wp_die( __( 'Sorry, you are not allowed to give users that role.' ) );
114
	}
115
116
	$userids = $_REQUEST['users'];
117
	$update = 'promote';
118
	foreach ( $userids as $id ) {
119
		$id = (int) $id;
120
121
		if ( ! current_user_can('promote_user', $id) )
122
			wp_die(__('Sorry, you are not allowed to edit this user.'));
123
		// The new role of the current user must also have the promote_users cap or be a multisite super admin
124
		if ( $id == $current_user->ID && ! $wp_roles->role_objects[ $role ]->has_cap('promote_users')
125
			&& ! ( is_multisite() && current_user_can( 'manage_network_users' ) ) ) {
126
				$update = 'err_admin_role';
127
				continue;
128
		}
129
130
		// If the user doesn't already belong to the blog, bail.
131 View Code Duplication
		if ( is_multisite() && !is_user_member_of_blog( $id ) ) {
132
			wp_die(
133
				'<h1>' . __( 'Cheatin&#8217; uh?' ) . '</h1>' .
134
				'<p>' . __( 'One of the selected users is not a member of this site.' ) . '</p>',
135
				403
136
			);
137
		}
138
139
		$user = get_userdata( $id );
140
		$user->set_role( $role );
141
	}
142
143
	wp_redirect(add_query_arg('update', $update, $redirect));
144
	exit();
145
146
case 'dodelete':
147
	if ( is_multisite() )
148
		wp_die( __('User deletion is not allowed from this screen.') );
149
150
	check_admin_referer('delete-users');
151
152
	if ( empty($_REQUEST['users']) ) {
153
		wp_redirect($redirect);
154
		exit();
155
	}
156
157
	$userids = array_map( 'intval', (array) $_REQUEST['users'] );
158
159
	if ( empty( $_REQUEST['delete_option'] ) ) {
160
		$url = self_admin_url( 'users.php?action=delete&users[]=' . implode( '&users[]=', $userids ) . '&error=true' );
161
		$url = str_replace( '&amp;', '&', wp_nonce_url( $url, 'bulk-users' ) );
162
		wp_redirect( $url );
163
		exit;
164
	}
165
166
	if ( ! current_user_can( 'delete_users' ) )
167
		wp_die(__('Sorry, you are not allowed to delete users.'));
168
169
	$update = 'del';
170
	$delete_count = 0;
171
172
	foreach ( $userids as $id ) {
173
		if ( ! current_user_can( 'delete_user', $id ) )
174
			wp_die(__( 'Sorry, you are not allowed to delete that user.' ) );
175
176
		if ( $id == $current_user->ID ) {
177
			$update = 'err_admin_del';
178
			continue;
179
		}
180
		switch ( $_REQUEST['delete_option'] ) {
181
		case 'delete':
182
			wp_delete_user( $id );
183
			break;
184
		case 'reassign':
185
			wp_delete_user( $id, $_REQUEST['reassign_user'] );
186
			break;
187
		}
188
		++$delete_count;
189
	}
190
191
	$redirect = add_query_arg( array('delete_count' => $delete_count, 'update' => $update), $redirect);
192
	wp_redirect($redirect);
193
	exit();
194
195
case 'delete':
196
	if ( is_multisite() )
197
		wp_die( __('User deletion is not allowed from this screen.') );
198
199
	check_admin_referer('bulk-users');
200
201
	if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {
202
		wp_redirect($redirect);
203
		exit();
204
	}
205
206
	if ( ! current_user_can( 'delete_users' ) )
207
		$errors = new WP_Error( 'edit_users', __( 'Sorry, you are not allowed to delete users.' ) );
208
209 View Code Duplication
	if ( empty($_REQUEST['users']) )
210
		$userids = array( intval( $_REQUEST['user'] ) );
211
	else
212
		$userids = array_map( 'intval', (array) $_REQUEST['users'] );
213
214
	$users_have_content = false;
215
	if ( $wpdb->get_var( "SELECT ID FROM {$wpdb->posts} WHERE post_author IN( " . implode( ',', $userids ) . " ) LIMIT 1" ) ) {
216
		$users_have_content = true;
217
	} elseif ( $wpdb->get_var( "SELECT link_id FROM {$wpdb->links} WHERE link_owner IN( " . implode( ',', $userids ) . " ) LIMIT 1" ) ) {
218
		$users_have_content = true;
219
	}
220
221
	if ( $users_have_content ) {
222
		add_action( 'admin_head', 'delete_users_add_js' );
223
	}
224
225
	include( ABSPATH . 'wp-admin/admin-header.php' );
226
?>
227
<form method="post" name="updateusers" id="updateusers">
228
<?php wp_nonce_field('delete-users') ?>
229
<?php echo $referer; ?>
230
231
<div class="wrap">
232
<h1><?php _e( 'Delete Users' ); ?></h1>
233
<?php if ( isset( $_REQUEST['error'] ) ) : ?>
234
	<div class="error">
235
		<p><strong><?php _e( 'ERROR:' ); ?></strong> <?php _e( 'Please select an option.' ); ?></p>
236
	</div>
237
<?php endif; ?>
238
239 View Code Duplication
<?php if ( 1 == count( $userids ) ) : ?>
240
	<p><?php _e( 'You have specified this user for deletion:' ); ?></p>
241
<?php else : ?>
242
	<p><?php _e( 'You have specified these users for deletion:' ); ?></p>
243
<?php endif; ?>
244
245
<ul>
246
<?php
247
	$go_delete = 0;
248
	foreach ( $userids as $id ) {
249
		$user = get_userdata( $id );
250
		if ( $id == $current_user->ID ) {
251
			/* translators: 1: user id, 2: user login */
252
			echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
253
		} else {
254
			/* translators: 1: user id, 2: user login */
255
			echo "<li><input type=\"hidden\" name=\"users[]\" value=\"" . esc_attr($id) . "\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
256
			$go_delete++;
257
		}
258
	}
259
	?>
260
	</ul>
261
<?php if ( $go_delete ) :
262
263
	if ( ! $users_have_content ) : ?>
264
		<input type="hidden" name="delete_option" value="delete" />
265
	<?php else: ?>
266
		<?php if ( 1 == $go_delete ) : ?>
267
			<fieldset><p><legend><?php _e( 'What should be done with content owned by this user?' ); ?></legend></p>
268
		<?php else : ?>
269
			<fieldset><p><legend><?php _e( 'What should be done with content owned by these users?' ); ?></legend></p>
270
		<?php endif; ?>
271
		<ul style="list-style:none;">
272
			<li><label><input type="radio" id="delete_option0" name="delete_option" value="delete" />
273
			<?php _e('Delete all content.'); ?></label></li>
274
			<li><input type="radio" id="delete_option1" name="delete_option" value="reassign" />
275
			<?php echo '<label for="delete_option1">' . __( 'Attribute all content to:' ) . '</label> ';
276
			wp_dropdown_users( array(
277
				'name' => 'reassign_user',
278
				'exclude' => array_diff( $userids, array( $current_user->ID ) ),
279
				'show' => 'display_name_with_login',
280
			) ); ?></li>
281
		</ul></fieldset>
282
	<?php endif;
283
	/**
284
	 * Fires at the end of the delete users form prior to the confirm button.
285
	 *
286
	 * @since 4.0.0
287
	 * @since 4.5.0 The `$userids` parameter was added.
288
	 *
289
	 * @param WP_User $current_user WP_User object for the current user.
290
	 * @param array   $userids      Array of IDs for users being deleted.
291
	 */
292
	do_action( 'delete_user_form', $current_user, $userids );
293
	?>
294
	<input type="hidden" name="action" value="dodelete" />
295
	<?php submit_button( __('Confirm Deletion'), 'primary' ); ?>
296
<?php else : ?>
297
	<p><?php _e('There are no valid users selected for deletion.'); ?></p>
298
<?php endif; ?>
299
</div>
300
</form>
301
<?php
302
303
break;
304
305
case 'doremove':
306
	check_admin_referer('remove-users');
307
308
	if ( ! is_multisite() )
309
		wp_die( __( 'You can&#8217;t remove users.' ) );
310
311
	if ( empty($_REQUEST['users']) ) {
312
		wp_redirect($redirect);
313
		exit;
314
	}
315
316
	if ( ! current_user_can( 'remove_users' ) )
317
		wp_die( __( 'Sorry, you are not allowed to remove users.' ) );
318
319
	$userids = $_REQUEST['users'];
320
321
	$update = 'remove';
322
 	foreach ( $userids as $id ) {
323
		$id = (int) $id;
324
		if ( !current_user_can('remove_user', $id) ) {
325
			$update = 'err_admin_remove';
326
			continue;
327
		}
328
		remove_user_from_blog($id, $blog_id);
329
	}
330
331
	$redirect = add_query_arg( array('update' => $update), $redirect);
332
	wp_redirect($redirect);
333
	exit;
334
335
case 'remove':
336
337
	check_admin_referer('bulk-users');
338
339
	if ( ! is_multisite() )
340
		wp_die( __( 'You can&#8217;t remove users.' ) );
341
342
	if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {
343
		wp_redirect($redirect);
344
		exit();
345
	}
346
347
	if ( !current_user_can('remove_users') )
348
		$error = new WP_Error('edit_users', __('Sorry, you are not allowed to remove users.'));
349
350 View Code Duplication
	if ( empty($_REQUEST['users']) )
351
		$userids = array(intval($_REQUEST['user']));
352
	else
353
		$userids = $_REQUEST['users'];
354
355
	include( ABSPATH . 'wp-admin/admin-header.php' );
356
?>
357
<form method="post" name="updateusers" id="updateusers">
358
<?php wp_nonce_field('remove-users') ?>
359
<?php echo $referer; ?>
360
361
<div class="wrap">
362
<h1><?php _e( 'Remove Users from Site' ); ?></h1>
363
364 View Code Duplication
<?php if ( 1 == count( $userids ) ) : ?>
365
	<p><?php _e( 'You have specified this user for removal:' ); ?></p>
366
<?php else : ?>
367
	<p><?php _e( 'You have specified these users for removal:' ); ?></p>
368
<?php endif; ?>
369
370
<ul>
371
<?php
372
	$go_remove = false;
373
 	foreach ( $userids as $id ) {
374
		$id = (int) $id;
375
 		$user = get_userdata( $id );
376
		if ( ! current_user_can( 'remove_user', $id ) ) {
377
			/* translators: 1: user id, 2: user login */
378
			echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>Sorry, you are not allowed to remove this user.</strong>'), $id, $user->user_login) . "</li>\n";
379
		} else {
380
			/* translators: 1: user id, 2: user login */
381
			echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
382
			$go_remove = true;
383
		}
384
 	}
385
 	?>
386
</ul>
387
<?php if ( $go_remove ) : ?>
388
		<input type="hidden" name="action" value="doremove" />
389
		<?php submit_button( __('Confirm Removal'), 'primary' ); ?>
390
<?php else : ?>
391
	<p><?php _e('There are no valid users selected for removal.'); ?></p>
392
<?php endif; ?>
393
</div>
394
</form>
395
<?php
396
397
break;
398
399
default:
400
401 View Code Duplication
	if ( !empty($_GET['_wp_http_referer']) ) {
402
		wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce'), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
0 ignored issues
show
It seems like wp_unslash($_SERVER['REQUEST_URI']) targeting wp_unslash() can also be of type array; however, remove_query_arg() does only seem to accept boolean|string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
It seems like remove_query_arg(array('...SERVER['REQUEST_URI'])) targeting remove_query_arg() can also be of type boolean; however, wp_redirect() does only seem to accept string, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
403
		exit;
404
	}
405
406
	if ( $wp_list_table->current_action() && ! empty( $_REQUEST['users'] ) ) {
407
		$userids = $_REQUEST['users'];
408
		$sendback = wp_get_referer();
409
410
		/** This action is documented in wp-admin/edit-comments.php */
411
		$sendback = apply_filters( 'handle_bulk_actions-' . get_current_screen()->id, $sendback, $wp_list_table->current_action(), $userids );
412
413
		wp_safe_redirect( $sendback );
414
		exit;
415
	}
416
417
	$wp_list_table->prepare_items();
418
	$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
419
	if ( $pagenum > $total_pages && $total_pages > 0 ) {
420
		wp_redirect( add_query_arg( 'paged', $total_pages ) );
421
		exit;
422
	}
423
424
	include( ABSPATH . 'wp-admin/admin-header.php' );
425
426
	$messages = array();
427
	if ( isset($_GET['update']) ) :
428
		switch($_GET['update']) {
429
		case 'del':
430
		case 'del_many':
431
			$delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;
432
			if ( 1 == $delete_count ) {
433
				$message = __( 'User deleted.' );
434
			} else {
435
				$message = _n( '%s user deleted.', '%s users deleted.', $delete_count );
436
			}
437
			$messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . sprintf( $message, number_format_i18n( $delete_count ) ) . '</p></div>';
438
			break;
439
		case 'add':
440
			if ( isset( $_GET['id'] ) && ( $user_id = $_GET['id'] ) && current_user_can( 'edit_user', $user_id ) ) {
441
				/* translators: %s: edit page url */
442
				$messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . sprintf( __( 'New user created. <a href="%s">Edit user</a>' ),
443
					esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
444
						self_admin_url( 'user-edit.php?user_id=' . $user_id ) ) ) ) . '</p></div>';
445
			} else {
446
				$messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __( 'New user created.' ) . '</p></div>';
447
			}
448
			break;
449
		case 'promote':
450
			$messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Changed roles.') . '</p></div>';
451
			break;
452 View Code Duplication
		case 'err_admin_role':
453
			$messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __('The current user&#8217;s role must have user editing capabilities.') . '</p></div>';
454
			$messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Other user roles have been changed.') . '</p></div>';
455
			break;
456 View Code Duplication
		case 'err_admin_del':
457
			$messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __('You can&#8217;t delete the current user.') . '</p></div>';
458
			$messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Other users have been deleted.') . '</p></div>';
459
			break;
460
		case 'remove':
461
			$messages[] = '<div id="message" class="updated notice is-dismissible fade"><p>' . __('User removed from this site.') . '</p></div>';
462
			break;
463 View Code Duplication
		case 'err_admin_remove':
464
			$messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __("You can't remove the current user.") . '</p></div>';
465
			$messages[] = '<div id="message" class="updated notice is-dismissible fade"><p>' . __('Other users have been removed.') . '</p></div>';
466
			break;
467
		}
468
	endif; ?>
469
470 View Code Duplication
<?php if ( isset($errors) && is_wp_error( $errors ) ) : ?>
471
	<div class="error">
472
		<ul>
473
		<?php
474
			foreach ( $errors->get_error_messages() as $err )
475
				echo "<li>$err</li>\n";
476
		?>
477
		</ul>
478
	</div>
479
<?php endif;
480
481
if ( ! empty($messages) ) {
482
	foreach ( $messages as $msg )
483
		echo $msg;
484
} ?>
485
486
<div class="wrap">
487
<h1 class="wp-heading-inline"><?php
488
echo esc_html( $title );
489
?></h1>
490
491
<?php
492
if ( current_user_can( 'create_users' ) ) { ?>
493
	<a href="<?php echo admin_url( 'user-new.php' ); ?>" class="page-title-action"><?php echo esc_html_x( 'Add New', 'user' ); ?></a>
494
<?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>
495
	<a href="<?php echo admin_url( 'user-new.php' ); ?>" class="page-title-action"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a>
496
<?php }
497
498 View Code Duplication
if ( strlen( $usersearch ) ) {
499
	/* translators: %s: search keywords */
500
	printf( '<span class="subtitle">' . __( 'Search results for &#8220;%s&#8221;' ) . '</span>', esc_html( $usersearch ) );
501
}
502
?>
503
504
<hr class="wp-header-end">
505
506
<?php $wp_list_table->views(); ?>
507
508
<form method="get">
509
510
<?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>
511
512
<?php if ( ! empty( $_REQUEST['role'] ) ) { ?>
513
<input type="hidden" name="role" value="<?php echo esc_attr( $_REQUEST['role'] ); ?>" />
514
<?php } ?>
515
516
<?php $wp_list_table->display(); ?>
517
</form>
518
519
<br class="clear" />
520
</div>
521
<?php
522
break;
523
524
} // end of the $doaction switch
525
526
include( ABSPATH . 'wp-admin/admin-footer.php' );
527