WordPress 3.8
[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 posts. 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 posts. 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="http://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 break;
141
142 case 'dodelete':
143         if ( is_multisite() )
144                 wp_die( __('User deletion is not allowed from this screen.') );
145
146         check_admin_referer('delete-users');
147
148         if ( empty($_REQUEST['users']) ) {
149                 wp_redirect($redirect);
150                 exit();
151         }
152
153         $userids = array_map( 'intval', (array) $_REQUEST['users'] );
154
155         if ( empty( $_REQUEST['delete_option'] ) ) {
156                 $url = self_admin_url( 'users.php?action=delete&users[]=' . implode( '&users[]=', $userids ) . '&error=true' );
157                 $url = str_replace( '&amp;', '&', wp_nonce_url( $url, 'bulk-users' ) );
158                 wp_redirect( $url );
159                 exit;
160         }
161
162         if ( ! current_user_can( 'delete_users' ) )
163                 wp_die(__('You can&#8217;t delete users.'));
164
165         $update = 'del';
166         $delete_count = 0;
167
168         foreach ( $userids as $id ) {
169                 if ( ! current_user_can( 'delete_user', $id ) )
170                         wp_die(__( 'You can&#8217;t delete that user.' ) );
171
172                 if ( $id == $current_user->ID ) {
173                         $update = 'err_admin_del';
174                         continue;
175                 }
176                 switch ( $_REQUEST['delete_option'] ) {
177                 case 'delete':
178                         wp_delete_user( $id );
179                         break;
180                 case 'reassign':
181                         wp_delete_user( $id, $_REQUEST['reassign_user'] );
182                         break;
183                 }
184                 ++$delete_count;
185         }
186
187         $redirect = add_query_arg( array('delete_count' => $delete_count, 'update' => $update), $redirect);
188         wp_redirect($redirect);
189         exit();
190
191 break;
192
193 case 'delete':
194         if ( is_multisite() )
195                 wp_die( __('User deletion is not allowed from this screen.') );
196
197         check_admin_referer('bulk-users');
198
199         if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {
200                 wp_redirect($redirect);
201                 exit();
202         }
203
204         if ( ! current_user_can( 'delete_users' ) )
205                 $errors = new WP_Error( 'edit_users', __( 'You can&#8217;t delete users.' ) );
206
207         if ( empty($_REQUEST['users']) )
208                 $userids = array( intval( $_REQUEST['user'] ) );
209         else
210                 $userids = array_map( 'intval', (array) $_REQUEST['users'] );
211
212         add_action( 'admin_head', 'delete_users_add_js' );
213
214         include( ABSPATH . 'wp-admin/admin-header.php' );
215 ?>
216 <form action="" method="post" name="updateusers" id="updateusers">
217 <?php wp_nonce_field('delete-users') ?>
218 <?php echo $referer; ?>
219
220 <div class="wrap">
221 <h2><?php _e('Delete Users'); ?></h2>
222 <?php if ( isset( $_REQUEST['error'] ) ) : ?>
223 <div class="error">
224         <p><strong><?php _e( 'ERROR:' ); ?></strong> <?php _e( 'Please select an option.' ); ?></p>
225 </div>
226 <?php endif; ?>
227 <p><?php echo _n( 'You have specified this user for deletion:', 'You have specified these users for deletion:', count( $userids ) ); ?></p>
228 <ul>
229 <?php
230         $go_delete = 0;
231         foreach ( $userids as $id ) {
232                 $user = get_userdata( $id );
233                 if ( $id == $current_user->ID ) {
234                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
235                 } else {
236                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"" . esc_attr($id) . "\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
237                         $go_delete++;
238                 }
239         }
240         ?>
241         </ul>
242 <?php if ( $go_delete ) : ?>
243         <fieldset><p><legend><?php echo _n( 'What should be done with posts owned by this user?', 'What should be done with posts owned by these users?', $go_delete ); ?></legend></p>
244         <ul style="list-style:none;">
245                 <li><label><input type="radio" id="delete_option0" name="delete_option" value="delete" />
246                 <?php _e('Delete all posts.'); ?></label></li>
247                 <li><input type="radio" id="delete_option1" name="delete_option" value="reassign" />
248                 <?php echo '<label for="delete_option1">' . __( 'Attribute all posts to:' ) . '</label> ';
249                 wp_dropdown_users( array( 'name' => 'reassign_user', 'exclude' => array_diff( $userids, array($current_user->ID) ) ) ); ?></li>
250         </ul></fieldset>
251         <input type="hidden" name="action" value="dodelete" />
252         <?php submit_button( __('Confirm Deletion'), 'secondary' ); ?>
253 <?php else : ?>
254         <p><?php _e('There are no valid users selected for deletion.'); ?></p>
255 <?php endif; ?>
256 </div>
257 </form>
258 <?php
259
260 break;
261
262 case 'doremove':
263         check_admin_referer('remove-users');
264
265         if ( ! is_multisite() )
266                 wp_die( __( 'You can&#8217;t remove users.' ) );
267
268         if ( empty($_REQUEST['users']) ) {
269                 wp_redirect($redirect);
270                 exit;
271         }
272
273         if ( ! current_user_can( 'remove_users' ) )
274                 wp_die( __( 'You can&#8217;t remove users.' ) );
275
276         $userids = $_REQUEST['users'];
277
278         $update = 'remove';
279         foreach ( $userids as $id ) {
280                 $id = (int) $id;
281                 if ( $id == $current_user->ID && !is_super_admin() ) {
282                         $update = 'err_admin_remove';
283                         continue;
284                 }
285                 if ( !current_user_can('remove_user', $id) ) {
286                         $update = 'err_admin_remove';
287                         continue;
288                 }
289                 remove_user_from_blog($id, $blog_id);
290         }
291
292         $redirect = add_query_arg( array('update' => $update), $redirect);
293         wp_redirect($redirect);
294         exit;
295
296 break;
297
298 case 'remove':
299
300         check_admin_referer('bulk-users');
301
302         if ( ! is_multisite() )
303                 wp_die( __( 'You can&#8217;t remove users.' ) );
304
305         if ( empty($_REQUEST['users']) && empty($_REQUEST['user']) ) {
306                 wp_redirect($redirect);
307                 exit();
308         }
309
310         if ( !current_user_can('remove_users') )
311                 $error = new WP_Error('edit_users', __('You can&#8217;t remove users.'));
312
313         if ( empty($_REQUEST['users']) )
314                 $userids = array(intval($_REQUEST['user']));
315         else
316                 $userids = $_REQUEST['users'];
317
318         include( ABSPATH . 'wp-admin/admin-header.php' );
319 ?>
320 <form action="" method="post" name="updateusers" id="updateusers">
321 <?php wp_nonce_field('remove-users') ?>
322 <?php echo $referer; ?>
323
324 <div class="wrap">
325 <h2><?php _e('Remove Users from Site'); ?></h2>
326 <p><?php _e('You have specified these users for removal:'); ?></p>
327 <ul>
328 <?php
329         $go_remove = false;
330         foreach ( $userids as $id ) {
331                 $id = (int) $id;
332                 $user = get_userdata( $id );
333                 if ( $id == $current_user->ID && !is_super_admin() ) {
334                         echo "<li>" . sprintf(__('ID #%1$s: %2$s <strong>The current user will not be removed.</strong>'), $id, $user->user_login) . "</li>\n";
335                 } elseif ( !current_user_can('remove_user', $id) ) {
336                         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";
337                 } else {
338                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1$s: %2$s'), $id, $user->user_login) . "</li>\n";
339                         $go_remove = true;
340                 }
341         }
342         ?>
343 <?php if ( $go_remove ) : ?>
344                 <input type="hidden" name="action" value="doremove" />
345                 <?php submit_button( __('Confirm Removal'), 'secondary' ); ?>
346 <?php else : ?>
347         <p><?php _e('There are no valid users selected for removal.'); ?></p>
348 <?php endif; ?>
349 </div>
350 </form>
351 <?php
352
353 break;
354
355 default:
356
357         if ( !empty($_GET['_wp_http_referer']) ) {
358                 wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce'), wp_unslash( $_SERVER['REQUEST_URI'] ) ) );
359                 exit;
360         }
361
362         $wp_list_table->prepare_items();
363         $total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
364         if ( $pagenum > $total_pages && $total_pages > 0 ) {
365                 wp_redirect( add_query_arg( 'paged', $total_pages ) );
366                 exit;
367         }
368
369         include( ABSPATH . 'wp-admin/admin-header.php' );
370
371         $messages = array();
372         if ( isset($_GET['update']) ) :
373                 switch($_GET['update']) {
374                 case 'del':
375                 case 'del_many':
376                         $delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;
377                         $messages[] = '<div id="message" class="updated"><p>' . sprintf( _n( 'User deleted.', '%s users deleted.', $delete_count ), number_format_i18n( $delete_count ) ) . '</p></div>';
378                         break;
379                 case 'add':
380                         if ( isset( $_GET['id'] ) && ( $user_id = $_GET['id'] ) && current_user_can( 'edit_user', $user_id ) ) {
381                                 $messages[] = '<div id="message" class="updated"><p>' . sprintf( __( 'New user created. <a href="%s">Edit user</a>' ),
382                                         esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
383                                                 self_admin_url( 'user-edit.php?user_id=' . $user_id ) ) ) ) . '</p></div>';
384                         } else {
385                                 $messages[] = '<div id="message" class="updated"><p>' . __( 'New user created.' ) . '</p></div>';
386                         }
387                         break;
388                 case 'promote':
389                         $messages[] = '<div id="message" class="updated"><p>' . __('Changed roles.') . '</p></div>';
390                         break;
391                 case 'err_admin_role':
392                         $messages[] = '<div id="message" class="error"><p>' . __('The current user&#8217;s role must have user editing capabilities.') . '</p></div>';
393                         $messages[] = '<div id="message" class="updated"><p>' . __('Other user roles have been changed.') . '</p></div>';
394                         break;
395                 case 'err_admin_del':
396                         $messages[] = '<div id="message" class="error"><p>' . __('You can&#8217;t delete the current user.') . '</p></div>';
397                         $messages[] = '<div id="message" class="updated"><p>' . __('Other users have been deleted.') . '</p></div>';
398                         break;
399                 case 'remove':
400                         $messages[] = '<div id="message" class="updated fade"><p>' . __('User removed from this site.') . '</p></div>';
401                         break;
402                 case 'err_admin_remove':
403                         $messages[] = '<div id="message" class="error"><p>' . __("You can't remove the current user.") . '</p></div>';
404                         $messages[] = '<div id="message" class="updated fade"><p>' . __('Other users have been removed.') . '</p></div>';
405                         break;
406                 }
407         endif; ?>
408
409 <?php if ( isset($errors) && is_wp_error( $errors ) ) : ?>
410         <div class="error">
411                 <ul>
412                 <?php
413                         foreach ( $errors->get_error_messages() as $err )
414                                 echo "<li>$err</li>\n";
415                 ?>
416                 </ul>
417         </div>
418 <?php endif;
419
420 if ( ! empty($messages) ) {
421         foreach ( $messages as $msg )
422                 echo $msg;
423 } ?>
424
425 <div class="wrap">
426 <h2>
427 <?php
428 echo esc_html( $title );
429 if ( current_user_can( 'create_users' ) ) { ?>
430         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add New', 'user' ); ?></a>
431 <?php } elseif ( is_multisite() && current_user_can( 'promote_users' ) ) { ?>
432         <a href="user-new.php" class="add-new-h2"><?php echo esc_html_x( 'Add Existing', 'user' ); ?></a>
433 <?php }
434
435 if ( $usersearch )
436         printf( '<span class="subtitle">' . __('Search results for &#8220;%s&#8221;') . '</span>', esc_html( $usersearch ) ); ?>
437 </h2>
438
439 <?php $wp_list_table->views(); ?>
440
441 <form action="" method="get">
442
443 <?php $wp_list_table->search_box( __( 'Search Users' ), 'user' ); ?>
444
445 <?php $wp_list_table->display(); ?>
446 </form>
447
448 <br class="clear" />
449 </div>
450 <?php
451 break;
452
453 } // end of the $doaction switch
454
455 include( ABSPATH . 'wp-admin/admin-footer.php' );