WordPress.org

Make WordPress Core

Ticket #15855: 15855.4.patch

File 15855.4.patch, 13.7 KB (added by SergeyBiryukov, 7 years ago)
  • wp-admin/includes/user.php

     
    380380        echo '</p></div>';
    381381}
    382382
    383 ?>
     383/**
     384 * Display a dropdown when deleting or removing a user from current site,
     385 * allowing to reassign their posts and links to another user.
     386 *
     387 * @since 3.1.0
     388 *
     389 * @param array $user User object.
     390 * @param array $selected_users IDs of users to delete or remove.
     391 * @return null
     392 */
     393function _reassign_dropdown( $user, $selected_users ) {
     394        static $counter = 0;
     395        ?>
     396        <li><input type="hidden" name="users[]" value="<?php echo esc_attr( $user->ID ); ?>" /><?php printf( __('ID #%1s: %2s'), $user->ID, $user->user_login ); ?></li>
     397        <fieldset><p><legend><?php printf( __( "What should be done with posts and links owned by <em>%s</em>?" ), $user->user_login ); ?></legend></p>
     398        <ul style="list-style:none;">
     399                <li><label><input type="radio" id="delete_option0" name="delete_option[<?php echo $user->ID; ?>]" value="delete" checked="checked" />
     400                <?php _e( 'Delete all posts and links.' ); ?></label></li>
     401                <li><label><input type="radio" id="delete_option1" name="delete_option[<?php echo $user->ID; ?>]" value="reassign" />
     402                <?php echo __( 'Attribute all posts and links to:' ) . '</label>'; ?>
     403                <?php wp_dropdown_users( array(
     404                        'exclude' => array_diff( $selected_users, array( $user->ID ) ),
     405                        'id' => "reassign{$counter}",
     406                        'name' => "reassign[{$user->ID}]" ) ); ?></li>
     407        </ul></fieldset><?php
     408        $counter++;
     409}
     410
     411?>
     412 No newline at end of file
  • wp-admin/network/site-users.php

     
    5555}
    5656$default_role = get_blog_option( $id, 'default_role' );
    5757
     58$referer = remove_query_arg( array( 'action', 'remove_count' ), wp_get_referer() );
     59
    5860$action = $wp_list_table->current_action();
    5961
    6062if ( $action ) {
     
    100102                        }
    101103                        break;
    102104               
    103                 case 'remove':
     105                case 'doremove':
    104106                        if ( !current_user_can('remove_users')  )
    105                                 die(__('You can&#8217;t remove users.'));
    106                         check_admin_referer( 'bulk-users' );
    107                        
     107                                die( __('You can&#8217;t remove users.') );
     108                        check_admin_referer( 'remove-users' );
     109
    108110                        $update = 'remove';
    109111                        if ( isset( $_REQUEST['users'] ) ) {
    110112                                $userids = $_REQUEST['users'];
    111113
    112                                 foreach ( $userids as $user_id ) {
     114                                $remove_count = 0;
     115                                foreach ( (array) $userids as $user_id ) {
    113116                                        $user_id = (int) $user_id;
    114                                         remove_user_from_blog( $user_id, $id );
     117                                        switch ( $_REQUEST['delete_option'][$user_id] ) {
     118                                        case 'delete':
     119                                                remove_user_from_blog( $user_id, $id );
     120                                                break;
     121                                        case 'reassign':
     122                                                remove_user_from_blog( $user_id, $id, $_REQUEST['reassign'][$user_id] );
     123                                                break;
     124                                        }
     125                                        ++$remove_count;
    115126                                }
    116                         } elseif ( isset( $_GET['user'] ) ) {
    117                                 remove_user_from_blog( $_GET['user'] );
    118127                        } else {
    119128                                $update = 'err_remove';
    120129                        }
     130                        $referer = add_query_arg( array( 'remove_count' => $remove_count, 'id' => $id ), $referer );
    121131                        break;
    122132
     133                case 'remove':
     134                        if ( !current_user_can('remove_users')  )
     135                                die( __('You can&#8217;t remove users.') );
     136                        check_admin_referer( 'bulk-users' );
     137
     138                        if ( empty($_REQUEST['users']) )
     139                                $userids = array( intval($_REQUEST['user']) );
     140                        else
     141                                $userids = $_REQUEST['users'];
     142
     143                        require_once( '../admin-header.php' );
     144                        ?>
     145                        <form action="" method="post" name="updateusers" id="updateusers">
     146                        <input type="hidden" name="id" value="<?php echo esc_attr( $_REQUEST['id'] ); ?>" />
     147                        <?php wp_nonce_field('remove-users') ?>
     148
     149                        <div class="wrap">
     150                        <?php screen_icon('users'); ?>
     151                        <h2><?php _e('Remove Users from Site'); ?></h2>
     152                        <p><?php _e('You have specified these users for removal:'); ?></p>
     153                        <ul>
     154                        <?php
     155                                $go_remove = false;
     156                                foreach ( $userids as $id ) {
     157                                        $id = (int) $id;
     158                                        $user = new WP_User($id);
     159                                        if ( $id == $current_user->id && ! is_super_admin() ) {
     160                                                echo "<li>" . sprintf( __('ID #%1s: %2s <strong>The current user will not be removed.</strong>'), $id, $user->user_login ) . "</li>\n";
     161                                        } elseif ( ! current_user_can('remove_user', $id) ) {
     162                                                echo "<li>" . sprintf( __('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login ) . "</li>\n";
     163                                        } else {
     164                                                _reassign_dropdown( $user, $userids );
     165                                                $go_remove = true;
     166                                        }
     167                                }
     168                        ?>
     169                        </ul>
     170                        <?php if ( $go_remove ) : ?>
     171                                        <input type="hidden" name="action" value="doremove" />
     172                                        <?php submit_button( __('Confirm Removal'), 'secondary' ); ?>
     173                        <?php else : ?>
     174                                <p><?php _e('There are no valid users selected for removal.'); ?></p>
     175                        <?php endif; ?>
     176                        </div>
     177                        </form><?php
     178                        require_once( '../admin-footer.php' );
     179                        exit();
     180                        break;
     181
    123182                case 'promote':
    124183                        check_admin_referer( 'bulk-users' );
    125184                        $editable_roles = get_editable_roles();
     
    146205        }
    147206       
    148207        restore_current_blog();
    149         wp_redirect( add_query_arg( 'update', $update, wp_get_referer() ) );
     208        wp_redirect( add_query_arg( 'update', $update, $referer ) );
    150209        exit();
    151210}
    152211
     
    199258                echo '<div id="message" class="error"><p>' . __( 'Select a user to change role.' ) . '</p></div>';
    200259                break;
    201260        case 'remove':
    202                 echo '<div id="message" class="updated"><p>' . __( 'User removed from this site.' ) . '</p></div>';
     261                $remove_count = isset($_GET['remove_count']) ? (int) $_GET['remove_count'] : 0;
     262                echo '<div id="message" class="updated"><p>' . sprintf( _n( 'User removed from this site.', '%s users removed from this site.', $remove_count ), $remove_count ) . '</p></div>';
    203263                break;
    204264        case 'err_remove':
    205265                echo '<div id="message" class="error"><p>' . __( 'Select a user to remove.' ) . '</p></div>';
  • wp-admin/users.php

     
    3333if ( empty($_REQUEST) ) {
    3434        $referer = '<input type="hidden" name="wp_http_referer" value="'. esc_attr(stripslashes($_SERVER['REQUEST_URI'])) . '" />';
    3535} elseif ( isset($_REQUEST['wp_http_referer']) ) {
    36         $redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), stripslashes($_REQUEST['wp_http_referer']));
     36        $redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count', 'remove_count'), stripslashes($_REQUEST['wp_http_referer']));
    3737        $referer = '<input type="hidden" name="wp_http_referer" value="' . esc_attr($redirect) . '" />';
    3838} else {
    3939        $redirect = 'users.php';
     
    9595        }
    9696
    9797        if ( ! current_user_can( 'delete_users' ) )
    98                 wp_die(__('You can&#8217;t delete users.'));
     98                wp_die( __('You can&#8217;t delete users.') );
    9999
    100100        $userids = $_REQUEST['users'];
    101101        $update = 'del';
    102102        $delete_count = 0;
    103103
    104         foreach ( (array) $userids as $id) {
     104        foreach ( (array) $userids as $id ) {
    105105                $id = (int) $id;
    106106
    107107                if ( ! current_user_can( 'delete_user', $id ) )
     
    111111                        $update = 'err_admin_del';
    112112                        continue;
    113113                }
    114                 switch ( $_REQUEST['delete_option'] ) {
     114
     115                switch ( $_REQUEST['delete_option'][$id] ) {
    115116                case 'delete':
    116                         if ( current_user_can('delete_user', $id) )
    117                                 wp_delete_user($id);
     117                        wp_delete_user($id);
    118118                        break;
    119119                case 'reassign':
    120                         if ( current_user_can('delete_user', $id) )
    121                                 wp_delete_user($id, $_REQUEST['reassign_user']);
     120                        wp_delete_user($id, $_REQUEST['reassign'][$id]);
    122121                        break;
    123122                }
    124123                ++$delete_count;
    125124        }
    126125
    127         $redirect = add_query_arg( array('delete_count' => $delete_count, 'update' => $update), $redirect);
     126        $redirect = add_query_arg( array( 'delete_count' => $delete_count, 'update' => $update ), $redirect );
    128127        wp_redirect($redirect);
    129128        exit();
    130129
     
    145144                $errors = new WP_Error( 'edit_users', __( 'You can&#8217;t delete users.' ) );
    146145
    147146        if ( empty($_REQUEST['users']) )
    148                 $userids = array(intval($_REQUEST['user']));
     147                $userids = array( intval($_REQUEST['user']) );
    149148        else
    150149                $userids = $_REQUEST['users'];
    151150
     
    166165                $id = (int) $id;
    167166                $user = new WP_User($id);
    168167                if ( $id == $current_user->ID ) {
    169                         echo "<li>" . sprintf(__('ID #%1s: %2s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
     168                        echo "<li>" . sprintf( __('ID #%1s: %2s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login ) . "</li>\n";
     169                } elseif ( ! current_user_can('delete_user', $id) ) {
     170                        echo "<li>" . sprintf( __('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login ) . "</li>\n";
    170171                } else {
    171                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"" . esc_attr($id) . "\" />" . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "</li>\n";
     172                        _reassign_dropdown( $user, $userids );
    172173                        $go_delete = true;
    173174                }
    174175        }
    175176        ?>
    176177        </ul>
    177178<?php if ( $go_delete ) : ?>
    178         <fieldset><p><legend><?php _e('What should be done with posts and links owned by this user?'); ?></legend></p>
    179         <ul style="list-style:none;">
    180                 <li><label><input type="radio" id="delete_option0" name="delete_option" value="delete" checked="checked" />
    181                 <?php _e('Delete all posts and links.'); ?></label></li>
    182                 <li><input type="radio" id="delete_option1" name="delete_option" value="reassign" />
    183                 <?php echo '<label for="delete_option1">'.__('Attribute all posts and links to:').'</label>';
    184                 wp_dropdown_users( array( 'exclude' => array_diff( $userids, array($current_user->ID) ) ) ); ?></li>
    185         </ul></fieldset>
    186179        <input type="hidden" name="action" value="dodelete" />
    187180        <?php submit_button( __('Confirm Deletion'), 'secondary' ); ?>
    188181<?php else : ?>
     
    202195                exit;
    203196        }
    204197
    205         if ( !current_user_can('remove_users') )
    206                 die(__('You can&#8217;t remove users.'));
     198        if ( ! current_user_can('remove_users') )
     199                die( __('You can&#8217;t remove users.') );
    207200
    208201        $userids = $_REQUEST['users'];
     202        $update = 'remove';
     203        $remove_count = 0;
    209204
    210         $update = 'remove';
    211         foreach ( $userids as $id ) {
     205        foreach ( (array) $userids as $id ) {
    212206                $id = (int) $id;
    213                 if ( $id == $current_user->id && !is_super_admin() ) {
    214                         $update = 'err_admin_remove';
     207
     208                if ( ! current_user_can('remove_user', $id) ) {
     209                        wp_die( __('You can&#8217;t remove that user.') );
    215210                        continue;
    216211                }
    217                 if ( !current_user_can('remove_user', $id) ) {
     212
     213                if ( $id == $current_user->id && !is_super_admin() ) {
    218214                        $update = 'err_admin_remove';
    219215                        continue;
    220216                }
    221                 remove_user_from_blog($id, $blog_id);
     217
     218                switch ( $_REQUEST['delete_option'][$id] ) {
     219                case 'delete':
     220                        remove_user_from_blog( $id, $blog_id );
     221                        break;
     222                case 'reassign':
     223                        remove_user_from_blog( $id, $blog_id, $_REQUEST['reassign'][$id] );
     224                        break;
     225                }
     226                ++$remove_count;
    222227        }
    223228
    224         $redirect = add_query_arg( array('update' => $update), $redirect);
     229        $redirect = add_query_arg( array( 'remove_count' => $remove_count, 'update' => $update ), $redirect );
    225230        wp_redirect($redirect);
    226231        exit;
    227232
     
    236241                exit();
    237242        }
    238243
    239         if ( !current_user_can('remove_users') )
    240                 $error = new WP_Error('edit_users', __('You can&#8217;t remove users.'));
     244        if ( !current_user_can( 'remove_users' ) )
     245                $error = new WP_Error( 'edit_users', __('You can&#8217;t remove users.') );
    241246
    242247        if ( empty($_REQUEST['users']) )
    243                 $userids = array(intval($_REQUEST['user']));
     248                $userids = array( intval($_REQUEST['user']) );
    244249        else
    245250                $userids = $_REQUEST['users'];
    246251
     
    260265        foreach ( $userids as $id ) {
    261266                $id = (int) $id;
    262267                $user = new WP_User($id);
    263                 if ( $id == $current_user->id && !is_super_admin() ) {
    264                         echo "<li>" . sprintf(__('ID #%1s: %2s <strong>The current user will not be removed.</strong>'), $id, $user->user_login) . "</li>\n";
    265                 } elseif ( !current_user_can('remove_user', $id) ) {
    266                         echo "<li>" . sprintf(__('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login) . "</li>\n";
     268                if ( $id == $current_user->id && ! is_super_admin() ) {
     269                        echo "<li>" . sprintf( __('ID #%1s: %2s <strong>The current user will not be removed.</strong>'), $id, $user->user_login ) . "</li>\n";
     270                } elseif ( ! current_user_can('remove_user', $id) ) {
     271                        echo "<li>" . sprintf( __('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login ) . "</li>\n";
    267272                } else {
    268                         echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "</li>\n";
     273                        _reassign_dropdown( $user, $userids );
    269274                        $go_remove = true;
    270275                }
    271276        }
     
    299304                case 'del':
    300305                case 'del_many':
    301306                        $delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;
    302                         $messages[] = '<div id="message" class="updated"><p>' . sprintf(_n('%s user deleted', '%s users deleted', $delete_count), $delete_count) . '</p></div>';
     307                        $messages[] = '<div id="message" class="updated"><p>' . sprintf( _n('%s user deleted', '%s users deleted', $delete_count), $delete_count ) . '</p></div>';
    303308                        break;
    304309                case 'add':
    305310                        $messages[] = '<div id="message" class="updated"><p>' . __('New user created.') . '</p></div>';
     
    316321                        $messages[] = '<div id="message" class="updated"><p>' . __('Other users have been deleted.') . '</p></div>';
    317322                        break;
    318323                case 'remove':
    319                         $messages[] = '<div id="message" class="updated fade"><p>' . __('User removed from this site.') . '</p></div>';
     324                        $remove_count = isset($_GET['remove_count']) ? (int) $_GET['remove_count'] : 0;
     325                        $messages[] = '<div id="message" class="updated fade"><p>' . sprintf( _n('User removed from this site.', '%s users removed from this site.', $remove_count), $remove_count ) . '</p></div>';
    320326                        break;
    321327                case 'err_admin_remove':
    322328                        $messages[] = '<div id="message" class="error"><p>' . __("You can't remove the current user.") . '</p></div>';