WordPress 4.2
[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 <h2><?php _e('Delete Users'); ?></h2>
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 <h2><?php _e('Remove Users from Site'); ?></h2>
340 <p><?php _e('You have specified these users for removal:'); ?></p>
341 <ul>
342 <?php
343         $go_remove = false;
344         foreach ( $userids as $id ) {
345                 $id = (int) $id;
346                 $user = get_userdata( $id );
347                 if ( $id == $current_user->ID && !is_super_admin() ) {
348                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be removed.</strong>'), $id, $user->user_login) . "</li>\n";
349                 } elseif ( !current_user_can('remove_user', $id) ) {
350                         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";
351                 } else {
352                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
353                         $go_remove = true;
354                 }
355         }
356         ?>
357 </ul>
358 <?php if ( $go_remove ) : ?>
359                 <input type="hidden" name="action" value="doremove" />
360                 <?php submit_button( __('Confirm Removal'), 'secondary' ); ?>
361 <?php else : ?>
362         <p><?php _e('There are no valid users selected for removal.'); ?></p>
363 <?php endif; ?>
364 </div>
365 </form>
366 <?php
367
368 break;
369
370 default:
371
372         if ( !empty($_GET['_wp_http_referer']) ) {
373                 wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce'), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
374                 exit;
375         }
376
377         $wp_list_table->prepare_items();
378         $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
379         if ( $pagenum > $total_pages && $total_pages > 0 ) {
380                 wp_redirect( add_query_arg( 'paged', $total_pages ) );
381                 exit;
382         }
383
384         include( ABSPATH . 'wp-admin/admin-header.php' );
385
386         $messages = array();
387         if ( isset($_GET['update']) ) :
388                 switch($_GET['update']) {
389                 case 'del':
390                 case 'del_many':
391                         $delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;
392                         if ( 1 == $delete_count ) {
393                                 $message = __( 'User deleted.' );
394                         } else {
395                                 $message = _n( '%s user deleted.', '%s users deleted.', $delete_count );
396                         }
397                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . sprintf( $message, number_format_i18n( $delete_count ) ) . '</p></div>';
398                         break;
399                 case 'add':
400                         if ( isset( $_GET['id'] ) && ( $user_id = $_GET['id'] ) && current_user_can( 'edit_user', $user_id ) ) {
401                                 $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . sprintf( __( 'New user created. <a href="%s">Edit user</a>' ),
402                                         esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
403                                                 self_admin_url( 'user-edit.php?user_id=' . $user_id ) ) ) ) . '</p></div>';
404                         } else {
405                                 $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __( 'New user created.' ) . '</p></div>';
406                         }
407                         break;
408                 case 'promote':
409                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Changed roles.') . '</p></div>';
410                         break;
411                 case 'err_admin_role':
412                         $messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __('The current user&#8217;s role must have user editing capabilities.') . '</p></div>';
413                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Other user roles have been changed.') . '</p></div>';
414                         break;
415                 case 'err_admin_del':
416                         $messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __('You can&#8217;t delete the current user.') . '</p></div>';
417                         $messages[] = '<div id="message" class="updated notice is-dismissible"><p>' . __('Other users have been deleted.') . '</p></div>';
418                         break;
419                 case 'remove':
420                         $messages[] = '<div id="message" class="updated notice is-dismissible fade"><p>' . __('User removed from this site.') . '</p></div>';
421                         break;
422                 case 'err_admin_remove':
423                         $messages[] = '<div id="message" class="error notice is-dismissible"><p>' . __("You can't remove the current user.") . '</p></div>';
424                         $messages[] = '<div id="message" class="updated notice is-dismissible fade"><p>' . __('Other users have been removed.') . '</p></div>';
425                         break;
426                 }
427         endif; ?>
428
429 <?php if ( isset($errors) && is_wp_error( $errors ) ) : ?>
430         <div class="error">
431                 <ul>
432                 <?php
433                         foreach ( $errors->get_error_messages() as $err )
434                                 echo "<li>$err</li>\n";
435                 ?>
436                 </ul>
437         </div>
438 <?php endif;
439
440 if ( ! empty($messages) ) {
441         foreach ( $messages as $msg )
442                 echo $msg;
443 } ?>
444
445 <div class="wrap">
446 <h2>
447 <?php
448 echo esc_html( $title );
449 if ( current_user_can( 'create_users' ) ) { ?>
450         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user' ); ?></a>
451 <?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>
452         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a>
453 <?php }
454
455 if ( $usersearch )
456         printf( '<span class="subtitle">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $usersearch ) ); ?>
457 </h2>
458
459 <?php $wp_list_table->views(); ?>
460
461 <form method="get">
462
463 <?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>
464
465 <?php $wp_list_table->display(); ?>
466 </form>
467
468 <br class="clear" />
469 </div>
470 <?php
471 break;
472
473 } // end of the $doaction switch
474
475 include( ABSPATH . 'wp-admin/admin-footer.php' );