WordPress 4.3
[autoinstalls/wordpress.git] / wp-admin / users.php
1 <?php
2 /**
3  * Users administration panel.
4  *
5  * @package WordPress
6  * @subpackage Administration
7  */
8
9 /** WordPress Administration Bootstrap */
10 require_once( dirname( __FILE__ ) . '/admin.php' );
11
12 if ( ! current_user_can( 'list_users' ) )
13         wp_die( __( 'Cheatin&#8217; uh?' ), 403 );
14
15 $wp_list_table = _get_list_table('WP_Users_List_Table');
16 $pagenum = $wp_list_table->get_pagenum();
17 $title = __('Users');
18 $parent_file = 'users.php';
19
20 add_screen_option( 'per_page' );
21
22 // contextual help - choose Help on the top right of admin panel to preview this.
23 get_current_screen()->add_help_tab( array(
24         'id'      => 'overview',
25         'title'   => __('Overview'),
26         '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>' .
27                                  '<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>'
28 ) ) ;
29
30 get_current_screen()->add_help_tab( array(
31         'id'      => 'screen-display',
32         'title'   => __('Screen Display'),
33         'content' => '<p>' . __('You can customize the display of this screen in a number of ways:') . '</p>' .
34                                         '<ul>' .
35                                         '<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>' .
36                                         '<li>' . __('You can filter the list of users by User Role using the text links in the upper left to show All, Administrator, Editor, Author, Contributor, or Subscriber. The default view is to show all users. Unused User Roles are not listed.') . '</li>' .
37                                         '<li>' . __('You can view all posts made by a user by clicking on the number under the Posts column.') . '</li>' .
38                                         '</ul>'
39 ) );
40
41 $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>' .
42         '<ul>' .
43         '<li>' . __('Edit takes you to the editable profile screen for that user. You can also reach that screen by clicking on the username.') . '</li>';
44
45 if ( is_multisite() )
46         $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>';
47 else
48         $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>';
49
50 $help .= '</ul>';
51
52 get_current_screen()->add_help_tab( array(
53         'id'      => 'actions',
54         'title'   => __('Actions'),
55         'content' => $help,
56 ) );
57 unset( $help );
58
59 get_current_screen()->set_help_sidebar(
60     '<p><strong>' . __('For more information:') . '</strong></p>' .
61     '<p>' . __('<a href="https://codex.wordpress.org/Users_Screen" target="_blank">Documentation on Managing Users</a>') . '</p>' .
62     '<p>' . __('<a href="https://codex.wordpress.org/Roles_and_Capabilities" target="_blank">Descriptions of Roles and Capabilities</a>') . '</p>' .
63     '<p>' . __('<a href="https://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
64 );
65
66 if ( empty($_REQUEST) ) {
67         $referer = '<input type="hidden" name="wp_http_referer" value="'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) ) . '" />';
68 } elseif ( isset($_REQUEST['wp_http_referer']) ) {
69         $redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), wp_unslash( $_REQUEST['wp_http_referer'] ) );
70         $referer = '<input type="hidden" name="wp_http_referer" value="' . esc_attr($redirect) . '" />';
71 } else {
72         $redirect = 'users.php';
73         $referer = '';
74 }
75
76 $update = '';
77
78 /**
79  * @since 3.5.0
80  * @access private
81  */
82 function delete_users_add_js() { ?>
83 <script>
84 jQuery(document).ready( function($) {
85         var submit = $('#submit').prop('disabled', true);
86         $('input[name=delete_option]').one('change', function() {
87                 submit.prop('disabled', false);
88         });
89         $('#reassign_user').focus( function() {
90                 $('#delete_option1').prop('checked', true).trigger('change');
91         });
92 });
93 </script>
94 <?php
95 }
96
97 switch ( $wp_list_table->current_action() ) {
98
99 /* Bulk Dropdown menu Role changes */
100 case 'promote':
101         check_admin_referer('bulk-users');
102
103         if ( ! current_user_can( 'promote_users' ) )
104                 wp_die( __( 'You can&#8217;t edit that user.' ) );
105
106         if ( empty($_REQUEST['users']) ) {
107                 wp_redirect($redirect);
108                 exit();
109         }
110
111         $editable_roles = get_editable_roles();
112         if ( empty( $editable_roles[$_REQUEST['new_role']] ) )
113                 wp_die(__('You can&#8217;t give users that role.'));
114
115         $userids = $_REQUEST['users'];
116         $update = 'promote';
117         foreach ( $userids as $id ) {
118                 $id = (int) $id;
119
120                 if ( ! current_user_can('promote_user', $id) )
121                         wp_die(__('You can&#8217;t edit that user.'));
122                 // The new role of the current user must also have the promote_users cap or be a multisite super admin
123                 if ( $id == $current_user->ID && ! $wp_roles->role_objects[ $_REQUEST['new_role'] ]->has_cap('promote_users')
124                         && ! ( is_multisite() && is_super_admin() ) ) {
125                                 $update = 'err_admin_role';
126                                 continue;
127                 }
128
129                 // If the user doesn't already belong to the blog, bail.
130                 if ( is_multisite() && !is_user_member_of_blog( $id ) )
131                         wp_die( __( 'Cheatin&#8217; uh?' ), 403 );
132
133                 $user = get_userdata( $id );
134                 $user->set_role($_REQUEST['new_role']);
135         }
136
137         wp_redirect(add_query_arg('update', $update, $redirect));
138         exit();
139
140 case 'dodelete':
141         if ( is_multisite() )
142                 wp_die( __('User deletion is not allowed from this screen.') );
143
144         check_admin_referer('delete-users');
145
146         if ( empty($_REQUEST['users']) ) {
147                 wp_redirect($redirect);
148                 exit();
149         }
150
151         $userids = array_map( 'intval', (array) $_REQUEST['users'] );
152
153         if ( empty( $_REQUEST['delete_option'] ) ) {
154                 $url = self_admin_url( 'users.php?action=delete&users[]=' . implode( '&users[]=', $userids ) . '&error=true' );
155                 $url = str_replace( '&amp;', '&', wp_nonce_url( $url, 'bulk-users' ) );
156                 wp_redirect( $url );
157                 exit;
158         }
159
160         if ( ! current_user_can( 'delete_users' ) )
161                 wp_die(__('You can&#8217;t delete users.'));
162
163         $update = 'del';
164         $delete_count = 0;
165
166         foreach ( $userids as $id ) {
167                 if ( ! current_user_can( 'delete_user', $id ) )
168                         wp_die(__( 'You can&#8217;t delete that user.' ) );
169
170                 if ( $id == $current_user->ID ) {
171                         $update = 'err_admin_del';
172                         continue;
173                 }
174                 switch ( $_REQUEST['delete_option'] ) {
175                 case 'delete':
176                         wp_delete_user( $id );
177                         break;
178                 case 'reassign':
179                         wp_delete_user( $id, $_REQUEST['reassign_user'] );
180                         break;
181                 }
182                 ++$delete_count;
183         }
184
185         $redirect = add_query_arg( array('delete_count' => $delete_count, 'update' => $update), $redirect);
186         wp_redirect($redirect);
187         exit();
188
189 case 'delete':
190         if ( is_multisite() )
191                 wp_die( __('User deletion is not allowed from this screen.') );
192
193         check_admin_referer('bulk-users');
194
195         if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {
196                 wp_redirect($redirect);
197                 exit();
198         }
199
200         if ( ! current_user_can( 'delete_users' ) )
201                 $errors = new WP_Error( 'edit_users', __( 'You can&#8217;t delete users.' ) );
202
203         if ( empty($_REQUEST['users']) )
204                 $userids = array( intval( $_REQUEST['user'] ) );
205         else
206                 $userids = array_map( 'intval', (array) $_REQUEST['users'] );
207
208         add_action( 'admin_head', 'delete_users_add_js' );
209
210         include( ABSPATH . 'wp-admin/admin-header.php' );
211 ?>
212 <form method="post" name="updateusers" id="updateusers">
213 <?php wp_nonce_field('delete-users') ?>
214 <?php echo $referer; ?>
215
216 <div class="wrap">
217 <h1><?php _e( 'Delete Users' ); ?></h1>
218 <?php if ( isset( $_REQUEST['error'] ) ) : ?>
219         <div class="error">
220                 <p><strong><?php _e( 'ERROR:' ); ?></strong> <?php _e( 'Please select an option.' ); ?></p>
221         </div>
222 <?php endif; ?>
223
224 <?php if ( 1 == count( $userids ) ) : ?>
225         <p><?php _e( 'You have specified this user for deletion:' ); ?></p>
226 <?php else : ?>
227         <p><?php _e( 'You have specified these users for deletion:' ); ?></p>
228 <?php endif; ?>
229
230 <ul>
231 <?php
232         $go_delete = 0;
233         foreach ( $userids as $id ) {
234                 $user = get_userdata( $id );
235                 if ( $id == $current_user->ID ) {
236                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
237                 } else {
238                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"" . esc_attr($id) . "\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
239                         $go_delete++;
240                 }
241         }
242         ?>
243         </ul>
244 <?php if ( $go_delete ) : ?>
245         <?php if ( 1 == $go_delete ) : ?>
246                 <fieldset><p><legend><?php _e( 'What should be done with content owned by this user?' ); ?></legend></p>
247         <?php else : ?>
248                 <fieldset><p><legend><?php _e( 'What should be done with content owned by these users?' ); ?></legend></p>
249         <?php endif; ?>
250         <ul style="list-style:none;">
251                 <li><label><input type="radio" id="delete_option0" name="delete_option" value="delete" />
252                 <?php _e('Delete all content.'); ?></label></li>
253                 <li><input type="radio" id="delete_option1" name="delete_option" value="reassign" />
254                 <?php echo '<label for="delete_option1">' . __( 'Attribute all content to:' ) . '</label> ';
255                 wp_dropdown_users( array( 'name' => 'reassign_user', 'exclude' => array_diff( $userids, array($current_user->ID) ) ) ); ?></li>
256         </ul></fieldset>
257         <?php
258         /**
259          * Fires at the end of the delete users form prior to the confirm button.
260          *
261          * @since 4.0.0
262          *
263          * @param WP_User $current_user WP_User object for the user being deleted.
264          */
265         do_action( 'delete_user_form', $current_user );
266         ?>
267         <input type="hidden" name="action" value="dodelete" />
268         <?php submit_button( __('Confirm Deletion'), 'secondary' ); ?>
269 <?php else : ?>
270         <p><?php _e('There are no valid users selected for deletion.'); ?></p>
271 <?php endif; ?>
272 </div>
273 </form>
274 <?php
275
276 break;
277
278 case 'doremove':
279         check_admin_referer('remove-users');
280
281         if ( ! is_multisite() )
282                 wp_die( __( 'You can&#8217;t remove users.' ) );
283
284         if ( empty($_REQUEST['users']) ) {
285                 wp_redirect($redirect);
286                 exit;
287         }
288
289         if ( ! current_user_can( 'remove_users' ) )
290                 wp_die( __( 'You can&#8217;t remove users.' ) );
291
292         $userids = $_REQUEST['users'];
293
294         $update = 'remove';
295         foreach ( $userids as $id ) {
296                 $id = (int) $id;
297                 if ( $id == $current_user->ID && !is_super_admin() ) {
298                         $update = 'err_admin_remove';
299                         continue;
300                 }
301                 if ( !current_user_can('remove_user', $id) ) {
302                         $update = 'err_admin_remove';
303                         continue;
304                 }
305                 remove_user_from_blog($id, $blog_id);
306         }
307
308         $redirect = add_query_arg( array('update' => $update), $redirect);
309         wp_redirect($redirect);
310         exit;
311
312 case 'remove':
313
314         check_admin_referer('bulk-users');
315
316         if ( ! is_multisite() )
317                 wp_die( __( 'You can&#8217;t remove users.' ) );
318
319         if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {
320                 wp_redirect($redirect);
321                 exit();
322         }
323
324         if ( !current_user_can('remove_users') )
325                 $error = new WP_Error('edit_users', __('You can&#8217;t remove users.'));
326
327         if ( empty($_REQUEST['users']) )
328                 $userids = array(intval($_REQUEST['user']));
329         else
330                 $userids = $_REQUEST['users'];
331
332         include( ABSPATH . 'wp-admin/admin-header.php' );
333 ?>
334 <form method="post" name="updateusers" id="updateusers">
335 <?php wp_nonce_field('remove-users') ?>
336 <?php echo $referer; ?>
337
338 <div class="wrap">
339 <h1><?php _e( 'Remove Users from Site' ); ?></h1>
340
341 <?php if ( 1 == count( $userids ) ) : ?>
342         <p><?php _e( 'You have specified this user for removal:' ); ?></p>
343 <?php else : ?>
344         <p><?php _e( 'You have specified these users for removal:' ); ?></p>
345 <?php endif; ?>
346
347 <ul>
348 <?php
349         $go_remove = false;
350         foreach ( $userids as $id ) {
351                 $id = (int) $id;
352                 $user = get_userdata( $id );
353                 if ( $id == $current_user->ID && !is_super_admin() ) {
354                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be removed.</strong>'), $id, $user->user_login) . "</li>\n";
355                 } elseif ( !current_user_can('remove_user', $id) ) {
356                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login) . "</li>\n";
357                 } else {
358                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
359                         $go_remove = true;
360                 }
361         }
362         ?>
363 </ul>
364 <?php if ( $go_remove ) : ?>
365                 <input type="hidden" name="action" value="doremove" />
366                 <?php submit_button( __('Confirm Removal'), 'secondary' ); ?>
367 <?php else : ?>
368         <p><?php _e('There are no valid users selected for removal.'); ?></p>
369 <?php endif; ?>
370 </div>
371 </form>
372 <?php
373
374 break;
375
376 default:
377
378         if ( !empty($_GET['_wp_http_referer']) ) {
379                 wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce'), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
380                 exit;
381         }
382
383         $wp_list_table->prepare_items();
384         $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
385         if ( $pagenum > $total_pages && $total_pages > 0 ) {
386                 wp_redirect( add_query_arg( 'paged', $total_pages ) );
387                 exit;
388         }
389
390         include( ABSPATH . 'wp-admin/admin-header.php' );
391
392         $messages = array();
393         if ( isset($_GET['update']) ) :
394                 switch($_GET['update']) {
395                 case 'del':
396                 case 'del_many':
397                         $delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;
398                         if ( 1 == $delete_count ) {
399                                 $message = __( 'User deleted.' );
400                         } else {
401                                 $message = _n( '%s user deleted.', '%s users deleted.', $delete_count );
402                         }
403                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . sprintf( $message, number_format_i18n( $delete_count ) ) . '</p></div>';
404                         break;
405                 case 'add':
406                         if ( isset( $_GET['id'] ) && ( $user_id = $_GET['id'] ) && current_user_can( 'edit_user', $user_id ) ) {
407                                 $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . sprintf( __( 'New user created. <a href="%s">Edit user</a>' ),
408                                         esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
409                                                 self_admin_url( 'user-edit.php?user_id=' . $user_id ) ) ) ) . '</p></div>';
410                         } else {
411                                 $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __( 'New user created.' ) . '</p></div>';
412                         }
413                         break;
414                 case 'promote':
415                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Changed roles.') . '</p></div>';
416                         break;
417                 case 'err_admin_role':
418                         $messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __('The current user&#8217;s role must have user editing capabilities.') . '</p></div>';
419                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Other user roles have been changed.') . '</p></div>';
420                         break;
421                 case 'err_admin_del':
422                         $messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __('You can&#8217;t delete the current user.') . '</p></div>';
423                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Other users have been deleted.') . '</p></div>';
424                         break;
425                 case 'remove':
426                         $messages[] = '<div id="message" class="updated notice is-dismissible fade"><p>' . __('User removed from this site.') . '</p></div>';
427                         break;
428                 case 'err_admin_remove':
429                         $messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __("You can't remove the current user.") . '</p></div>';
430                         $messages[] = '<div id="message" class="updated notice is-dismissible fade"><p>' . __('Other users have been removed.') . '</p></div>';
431                         break;
432                 }
433         endif; ?>
434
435 <?php if ( isset($errors) && is_wp_error( $errors ) ) : ?>
436         <div class="error">
437                 <ul>
438                 <?php
439                         foreach ( $errors->get_error_messages() as $err )
440                                 echo "<li>$err</li>\n";
441                 ?>
442                 </ul>
443         </div>
444 <?php endif;
445
446 if ( ! empty($messages) ) {
447         foreach ( $messages as $msg )
448                 echo $msg;
449 } ?>
450
451 <div class="wrap">
452 <h1>
453 <?php
454 echo esc_html( $title );
455 if ( current_user_can( 'create_users' ) ) { ?>
456         <a href="user-new.php" class="page-title-action"><?php echo esc_html_x( 'Add New', 'user' ); ?></a>
457 <?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>
458         <a href="user-new.php" class="page-title-action"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a>
459 <?php }
460
461 if ( $usersearch )
462         printf( '<span class="subtitle">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $usersearch ) ); ?>
463 </h1>
464
465 <?php $wp_list_table->views(); ?>
466
467 <form method="get">
468
469 <?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>
470
471 <?php $wp_list_table->display(); ?>
472 </form>
473
474 <br class="clear" />
475 </div>
476 <?php
477 break;
478
479 } // end of the $doaction switch
480
481 include( ABSPATH . 'wp-admin/admin-footer.php' );