WordPress.org

Make WordPress Core

Ticket #16293: 16293.diff

File 16293.diff, 3.9 KB (added by garyc40, 7 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';