WordPress.org

Make WordPress Core

Ticket #16293: 16293.diff

File 16293.diff, 3.9 KB (added by garyc40, 3 years ago)

allow deleting super admins

  • wp-admin/includes/class-wp-ms-users-list-table.php

    diff --git wp-admin/includes/class-wp-ms-users-list-table.php wp-admin/includes/class-wp-ms-users-list-table.php
    index 36d55e1..f255553 100644
    class WP_MS_Users_List_Table extends WP_List_Table { 
    188188                                                                $actions = array(); 
    189189                                                                $actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>'; 
    190190 
    191                                                                 if ( current_user_can( 'delete_user', $user->ID) && ! in_array( $user->user_login, $super_admins ) ) { 
     191                                                                if ( current_user_can( 'delete_user', $user->ID) && $user->user_email != get_site_option( 'admin_email' ) && $user->ID != get_current_user_id() && count( $super_admins ) > 1 ) { 
    192192                                                                        $actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>'; 
    193193                                                                } 
    194194 
  • wp-admin/includes/ms.php

    diff --git wp-admin/includes/ms.php wp-admin/includes/ms.php
    index 8458526..a5a04ba 100644
    function wpmu_delete_user( $id ) { 
    140140 
    141141        $id = (int) $id; 
    142142 
     143        if ( is_super_admin( $id ) ) 
     144                if ( ! revoke_super_admin( $id ) ) 
     145                        return false; 
     146 
    143147        do_action( 'wpmu_delete_user', $id ); 
    144148 
    145149        $blogs = get_blogs_of_user( $id ); 
    function wpmu_delete_user( $id ) { 
    165169                        restore_current_blog(); 
    166170                } 
    167171        } 
    168  
     172         
    169173        $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->users WHERE ID = %d", $id ) ); 
    170174        $wpdb->query( $wpdb->prepare( "DELETE FROM $wpdb->usermeta WHERE user_id = %d", $id ) ); 
    171175 
  • wp-admin/network/edit.php

    diff --git wp-admin/network/edit.php wp-admin/network/edit.php
    index 2d3f952..7b412fd 100644
    function confirm_delete_users( $users ) { 
    2222        $current_user = wp_get_current_user(); 
    2323        if ( !is_array( $users ) ) 
    2424                return false; 
    25  
    2625        screen_icon(); 
    2726        ?> 
    2827        <h2><?php esc_html_e( 'Users' ); ?></h2> 
     28        <?php ob_start(); ?> 
    2929        <p><?php _e( 'Transfer or delete posts and links before deleting users.' ); ?></p> 
    3030        <form action="edit.php?action=dodelete" method="post"> 
    3131        <input type="hidden" name="dodelete" /> 
    3232        <?php 
    3333        wp_nonce_field( 'ms-users-delete' ); 
    3434        $site_admins = get_super_admins(); 
     35        $site_admin_count = count( $site_admins ); 
    3536        $admin_out = "<option value='$current_user->ID'>$current_user->user_login</option>"; 
    3637 
    3738        foreach ( ( $allusers = (array) $_POST['allusers'] ) as $key => $val ) { 
    function confirm_delete_users( $users ) { 
    4142                        if ( ! current_user_can( 'delete_user', $delete_user->ID ) ) 
    4243                                wp_die( sprintf( __( 'Warning! User %s cannot be deleted.' ), $delete_user->user_login ) ); 
    4344 
    44                         if ( in_array( $delete_user->user_login, $site_admins ) ) 
    45                                 wp_die( sprintf( __( 'Warning! User cannot be deleted. The user %s is a network admnistrator.' ), $delete_user->user_login ) ); 
     45                        if ( in_array( $delete_user->user_login, $site_admins ) ) { 
     46                                $site_admin_count --; 
     47 
     48                                if ( $site_admin_count < 1 ) { 
     49                                        ob_end_clean(); // don't even output the form 
     50                                        wp_die( __( 'You cannot delete all super admins.' ) ); 
     51                                } 
     52                        } 
    4653 
    4754                        echo "<input type='hidden' name='user[]' value='{$val}'/>\n"; 
    4855                        $blogs = get_blogs_of_user( $val, true ); 
    function confirm_delete_users( $users ) { 
    8592        ?> 
    8693        </form> 
    8794    <?php 
     95        echo ob_get_clean(); 
    8896        return true; 
    8997} 
    9098 
    switch ( $_GET['action'] ) { 
    356364 
    357365                check_admin_referer( 'deleteuser' ); 
    358366 
    359                 if ( $id != '0' && $id != '1' ) { 
     367                $user = get_userdata( $id ); 
     368 
     369                if ( ! is_super_admin( $id ) || ( $user->user_email != get_site_option( 'admin_email' ) && get_current_user_id() != $id && count( get_super_admins() ) > 1 ) ) { 
    360370                        $_POST['allusers'] = array( $id ); // confirm_delete_users() can only handle with arrays 
    361371                        $title = __( 'Users' ); 
    362372                        $parent_file = 'users.php';