WordPress 4.0
[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?' ) );
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', array('label' => _x( 'Users', 'users per page (screen options)' )) );
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="http://codex.wordpress.org/Users_Screen" target="_blank">Documentation on Managing Users</a>') . '</p>' .
62     '<p>' . __('<a href="http://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?'));
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 action="" 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 <p><?php echo _n( 'You have specified this user for deletion:', 'You have specified these users for deletion:', count( $userids ) ); ?></p>
224 <ul>
225 <?php
226         $go_delete = 0;
227         foreach ( $userids as $id ) {
228                 $user = get_userdata( $id );
229                 if ( $id == $current_user->ID ) {
230                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
231                 } else {
232                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"" . esc_attr($id) . "\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
233                         $go_delete++;
234                 }
235         }
236         ?>
237         </ul>
238 <?php if ( $go_delete ) : ?>
239         <fieldset><p><legend><?php echo _n( 'What should be done with content owned by this user?', 'What should be done with content owned by these users?', $go_delete ); ?></legend></p>
240         <ul style="list-style:none;">
241                 <li><label><input type="radio" id="delete_option0" name="delete_option" value="delete" />
242                 <?php _e('Delete all content.'); ?></label></li>
243                 <li><input type="radio" id="delete_option1" name="delete_option" value="reassign" />
244                 <?php echo '<label for="delete_option1">' . __( 'Attribute all content to:' ) . '</label> ';
245                 wp_dropdown_users( array( 'name' => 'reassign_user', 'exclude' => array_diff( $userids, array($current_user->ID) ) ) ); ?></li>
246         </ul></fieldset>
247         <?php
248         /**
249          * Fires at the end of the delete users form prior to the confirm button.
250          *
251          * @since 4.0.0
252          *
253          * @param WP_User $current_user WP_User object for the user being deleted.
254          */
255         do_action( 'delete_user_form', $current_user );
256         ?>
257         <input type="hidden" name="action" value="dodelete" />
258         <?php submit_button( __('Confirm Deletion'), 'secondary' ); ?>
259 <?php else : ?>
260         <p><?php _e('There are no valid users selected for deletion.'); ?></p>
261 <?php endif; ?>
262 </div>
263 </form>
264 <?php
265
266 break;
267
268 case 'doremove':
269         check_admin_referer('remove-users');
270
271         if ( ! is_multisite() )
272                 wp_die( __( 'You can&#8217;t remove users.' ) );
273
274         if ( empty($_REQUEST['users']) ) {
275                 wp_redirect($redirect);
276                 exit;
277         }
278
279         if ( ! current_user_can( 'remove_users' ) )
280                 wp_die( __( 'You can&#8217;t remove users.' ) );
281
282         $userids = $_REQUEST['users'];
283
284         $update = 'remove';
285         foreach ( $userids as $id ) {
286                 $id = (int) $id;
287                 if ( $id == $current_user->ID && !is_super_admin() ) {
288                         $update = 'err_admin_remove';
289                         continue;
290                 }
291                 if ( !current_user_can('remove_user', $id) ) {
292                         $update = 'err_admin_remove';
293                         continue;
294                 }
295                 remove_user_from_blog($id, $blog_id);
296         }
297
298         $redirect = add_query_arg( array('update' => $update), $redirect);
299         wp_redirect($redirect);
300         exit;
301
302 case 'remove':
303
304         check_admin_referer('bulk-users');
305
306         if ( ! is_multisite() )
307                 wp_die( __( 'You can&#8217;t remove users.' ) );
308
309         if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {
310                 wp_redirect($redirect);
311                 exit();
312         }
313
314         if ( !current_user_can('remove_users') )
315                 $error = new WP_Error('edit_users', __('You can&#8217;t remove users.'));
316
317         if ( empty($_REQUEST['users']) )
318                 $userids = array(intval($_REQUEST['user']));
319         else
320                 $userids = $_REQUEST['users'];
321
322         include( ABSPATH . 'wp-admin/admin-header.php' );
323 ?>
324 <form action="" method="post" name="updateusers" id="updateusers">
325 <?php wp_nonce_field('remove-users') ?>
326 <?php echo $referer; ?>
327
328 <div class="wrap">
329 <h2><?php _e('Remove Users from Site'); ?></h2>
330 <p><?php _e('You have specified these users for removal:'); ?></p>
331 <ul>
332 <?php
333         $go_remove = false;
334         foreach ( $userids as $id ) {
335                 $id = (int) $id;
336                 $user = get_userdata( $id );
337                 if ( $id == $current_user->ID && !is_super_admin() ) {
338                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be removed.</strong>'), $id, $user->user_login) . "</li>\n";
339                 } elseif ( !current_user_can('remove_user', $id) ) {
340                         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";
341                 } else {
342                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
343                         $go_remove = true;
344                 }
345         }
346         ?>
347 </ul>
348 <?php if ( $go_remove ) : ?>
349                 <input type="hidden" name="action" value="doremove" />
350                 <?php submit_button( __('Confirm Removal'), 'secondary' ); ?>
351 <?php else : ?>
352         <p><?php _e('There are no valid users selected for removal.'); ?></p>
353 <?php endif; ?>
354 </div>
355 </form>
356 <?php
357
358 break;
359
360 default:
361
362         if ( !empty($_GET['_wp_http_referer']) ) {
363                 wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce'), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
364                 exit;
365         }
366
367         $wp_list_table->prepare_items();
368         $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
369         if ( $pagenum > $total_pages && $total_pages > 0 ) {
370                 wp_redirect( add_query_arg( 'paged', $total_pages ) );
371                 exit;
372         }
373
374         include( ABSPATH . 'wp-admin/admin-header.php' );
375
376         $messages = array();
377         if ( isset($_GET['update']) ) :
378                 switch($_GET['update']) {
379                 case 'del':
380                 case 'del_many':
381                         $delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;
382                         $messages[] = '<div id="message" class="updated"><p>' . sprintf( _n( 'User deleted.', '%s users deleted.', $delete_count ), number_format_i18n( $delete_count ) ) . '</p></div>';
383                         break;
384                 case 'add':
385                         if ( isset( $_GET['id'] ) && ( $user_id = $_GET['id'] ) && current_user_can( 'edit_user', $user_id ) ) {
386                                 $messages[] = '<div id="message" class="updated"><p>' . sprintf( __( 'New user created. <a href="%s">Edit user</a>' ),
387                                         esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
388                                                 self_admin_url( 'user-edit.php?user_id=' . $user_id ) ) ) ) . '</p></div>';
389                         } else {
390                                 $messages[] = '<div id="message" class="updated"><p>' . __( 'New user created.' ) . '</p></div>';
391                         }
392                         break;
393                 case 'promote':
394                         $messages[] = '<div id="message" class="updated"><p>' . __('Changed roles.') . '</p></div>';
395                         break;
396                 case 'err_admin_role':
397                         $messages[] = '<div id="message" class="error"><p>' . __('The current user&#8217;s role must have user editing capabilities.') . '</p></div>';
398                         $messages[] = '<div id="message" class="updated"><p>' . __('Other user roles have been changed.') . '</p></div>';
399                         break;
400                 case 'err_admin_del':
401                         $messages[] = '<div id="message" class="error"><p>' . __('You can&#8217;t delete the current user.') . '</p></div>';
402                         $messages[] = '<div id="message" class="updated"><p>' . __('Other users have been deleted.') . '</p></div>';
403                         break;
404                 case 'remove':
405                         $messages[] = '<div id="message" class="updated fade"><p>' . __('User removed from this site.') . '</p></div>';
406                         break;
407                 case 'err_admin_remove':
408                         $messages[] = '<div id="message" class="error"><p>' . __("You can't remove the current user.") . '</p></div>';
409                         $messages[] = '<div id="message" class="updated fade"><p>' . __('Other users have been removed.') . '</p></div>';
410                         break;
411                 }
412         endif; ?>
413
414 <?php if ( isset($errors) && is_wp_error( $errors ) ) : ?>
415         <div class="error">
416                 <ul>
417                 <?php
418                         foreach ( $errors->get_error_messages() as $err )
419                                 echo "<li>$err</li>\n";
420                 ?>
421                 </ul>
422         </div>
423 <?php endif;
424
425 if ( ! empty($messages) ) {
426         foreach ( $messages as $msg )
427                 echo $msg;
428 } ?>
429
430 <div class="wrap">
431 <h2>
432 <?php
433 echo esc_html( $title );
434 if ( current_user_can( 'create_users' ) ) { ?>
435         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user' ); ?></a>
436 <?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>
437         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a>
438 <?php }
439
440 if ( $usersearch )
441         printf( '<span class="subtitle">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $usersearch ) ); ?>
442 </h2>
443
444 <?php $wp_list_table->views(); ?>
445
446 <form action="" method="get">
447
448 <?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>
449
450 <?php $wp_list_table->display(); ?>
451 </form>
452
453 <br class="clear" />
454 </div>
455 <?php
456 break;
457
458 } // end of the $doaction switch
459
460 include( ABSPATH . 'wp-admin/admin-footer.php' );