WordPress.org

Make WordPress Core

Ticket #5540: user_role-r6506-a.patch

File user_role-r6506-a.patch, 8.2 KB (added by tellyworth, 6 years ago)

Updated patch fixes an issue with get_users_of_blog()

  • wordpress/wp-includes/wp-db.php

     
    3333        var $options; 
    3434        var $postmeta; 
    3535        var $usermeta; 
     36        var $user_role; 
    3637        var $terms; 
    3738        var $term_taxonomy; 
    3839        var $term_relationships; 
    39         var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options', 
     40        var $tables = array('users', 'usermeta', 'user_role', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options', 
    4041                        'postmeta', 'terms', 'term_taxonomy', 'term_relationships'); 
    4142        var $charset; 
    4243        var $collate; 
  • wordpress/wp-includes/version.php

     
    33// This holds the version number in a separate file so we can bump it without cluttering the SVN 
    44 
    55$wp_version = '2.4-bleeding'; 
    6 $wp_db_version = 6124; 
     6$wp_db_version = 6506; 
    77 
    88?> 
  • wordpress/wp-includes/capabilities.php

     
    178178                if ( ! isset($wp_roles) ) 
    179179                        $wp_roles = new WP_Roles(); 
    180180 
    181                 //Filter out caps that are not role names and assign to $this->roles 
     181                //This handles the old usermeta capabilities if present 
    182182                if(is_array($this->caps)) 
    183183                        $this->roles = array_filter(array_keys($this->caps), array(&$wp_roles, 'is_role')); 
     184                 
     185                // Fetch roles from the user_role table 
     186                global $wpdb, $blog_id; 
     187                $user_id = intval($this->ID); 
     188                $roles = $wpdb->get_col("SELECT role FROM {$wpdb->user_role} WHERE blog_id = {$blog_id} AND user_id = {$user_id}"); 
     189                if ($roles) 
     190                        $this->roles = array_filter($roles, array(&$wp_roles, 'is_role')); 
    184191 
    185192                //Build $allcaps from role caps, overlay user's $caps 
    186193                $this->allcaps = array(); 
    187194                foreach( (array) $this->roles as $role) { 
     195                        $this->allcaps[$role] = true; 
    188196                        $role = $wp_roles->get_role($role); 
    189197                        $this->allcaps = array_merge($this->allcaps, $role->capabilities); 
    190198                } 
     
    192200        } 
    193201 
    194202        function add_role($role) { 
     203                if ( !is_role($role) ) 
     204                        return new WP_Error( 'invalid_user_role', sprintf(__('Invalid user role: %s'), $role) ); 
     205                         
    195206                $this->caps[$role] = true; 
    196                 update_usermeta($this->ID, $this->cap_key, $this->caps); 
     207                global $wpdb, $blog_id; 
     208                $user_id = intval($this->ID); 
     209                $role = $wpdb->escape($role); 
     210                $wpdb->query( "INSERT INTO {$wpdb->user_role} (blog_id, user_id, role) VALUES ({$blog_id}, {$user_id}, '{$role}')" ); 
    197211                $this->get_role_caps(); 
    198212                $this->update_user_level_from_caps(); 
    199213        } 
    200214 
    201215        function remove_role($role) { 
    202                 if ( empty($this->roles[$role]) || (count($this->roles) <= 1) ) 
    203                         return; 
    204216                unset($this->caps[$role]); 
    205                 update_usermeta($this->ID, $this->cap_key, $this->caps); 
     217                global $wpdb, $blog_id; 
     218                $user_id = intval($this->ID); 
     219                $role = $wpdb->escape($role); 
     220                $wpdb->query( "DELETE FROM {$wpdb->user_role} WHERE blog_id = {$blog_id} AND user_id = {$user_id} AND role = '{$role}'" ); 
    206221                $this->get_role_caps(); 
    207222        } 
    208223 
    209224        function set_role($role) { 
    210                 foreach($this->roles as $oldrole) 
    211                         unset($this->caps[$oldrole]); 
     225                foreach($this->roles as $oldrole) { 
     226                        if ($oldrole != $role) 
     227                                $this->remove_role($oldrole); 
     228                } 
    212229                if ( !empty($role) ) { 
    213                         $this->caps[$role] = true; 
    214                         $this->roles = array($role => true); 
     230                        if ( !in_array($role, $this->roles) ) 
     231                                $this->add_role($role); 
    215232                } else { 
    216233                        $this->roles = false; 
    217234                } 
    218                 update_usermeta($this->ID, $this->cap_key, $this->caps); 
    219                 $this->get_role_caps(); 
    220                 $this->update_user_level_from_caps(); 
    221235        } 
    222236 
    223237        function level_reduction($max, $item) { 
     
    259273        function has_cap($cap) { 
    260274                if ( is_numeric($cap) ) 
    261275                        $cap = $this->translate_level_to_cap($cap); 
    262  
     276                         
    263277                $args = array_slice(func_get_args(), 1); 
    264278                $args = array_merge(array($cap, $this->ID), $args); 
    265279                $caps = call_user_func_array('map_meta_cap', $args); 
     
    481495        return $wp_roles->remove_role($role); 
    482496} 
    483497 
     498function is_role($role) { 
     499        global $wp_roles; 
     500 
     501        if ( ! isset($wp_roles) ) 
     502                $wp_roles = new WP_Roles(); 
     503 
     504        return $wp_roles->is_role($role); 
     505} 
     506 
    484507?> 
  • wordpress/wp-includes/user.php

     
    5252        global $wpdb, $blog_id; 
    5353        if ( empty($id) ) 
    5454                $id = (int) $blog_id; 
    55         $users = $wpdb->get_results( "SELECT user_id, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE " . $wpdb->users . ".ID = " . $wpdb->usermeta . ".user_id AND meta_key = '" . $wpdb->prefix . "capabilities' ORDER BY {$wpdb->usermeta}.user_id" ); 
     55        $users = $wpdb->get_results( "SELECT user_id, user_login, display_name, user_email, role FROM {$wpdb->users}, {$wpdb->user_role} WHERE {$wpdb->users}.ID = {$wpdb->user_role}.user_id GROUP BY user_id ORDER BY {$wpdb->user_role}.user_id" ); 
    5656        return $users; 
    5757} 
    5858 
  • wordpress/wp-admin/includes/schema.php

     
    143143  PRIMARY KEY  (umeta_id), 
    144144  KEY user_id (user_id), 
    145145  KEY meta_key (meta_key) 
    146 ) $charset_collate;"; 
     146) $charset_collate; 
     147CREATE TABLE IF NOT EXISTS $wpdb->user_role ( 
     148  user_role_id bigint(20) NOT NULL auto_increment, 
     149  blog_id bigint(20) NOT NULL default '0', 
     150  user_id bigint(20) NOT NULL default '0', 
     151  role varchar(32) NOT NULL default '', 
     152  PRIMARY KEY  (user_role_id), 
     153  KEY user_blog (blog_id,user_id), 
     154  KEY user_id (user_id) 
     155) $charset_collate; 
     156"; 
    147157 
    148158function populate_options() { 
    149159        global $wpdb, $wp_db_version; 
  • wordpress/wp-admin/includes/user.php

     
    266266 
    267267        $wpdb->query("DELETE FROM $wpdb->users WHERE ID = $id"); 
    268268        $wpdb->query("DELETE FROM $wpdb->usermeta WHERE user_id = '$id'"); 
     269        $wpdb->query("DELETE FROM $wpdb->user_role WHERE user_id = '$id'"); 
    269270 
    270271        wp_cache_delete($id, 'users'); 
    271272        wp_cache_delete($user->user_login, 'userlogins'); 
  • wordpress/wp-admin/includes/upgrade.php

     
    197197 
    198198        if ( $wp_current_db_version < 6124 ) 
    199199                upgrade_230_old_tables(); 
     200                 
     201        global $wpdb, $blog_id; 
     202        if ( $wp_current_db_version < 6506 ) 
     203                upgrade_user_roles($wpdb->prefix, $blog_id); 
    200204 
    201205        maybe_disable_automattic_widgets(); 
    202206 
     
    715719        $wpdb->query("UPDATE $wpdb->postmeta SET meta_key = '_wp_old_slug' WHERE meta_key = 'old_slug'"); 
    716720} 
    717721 
     722function upgrade_user_roles($prefix, $blog_id) { 
     723        // convert the old capabilities usermeta into user_role rows 
     724        // old usermeta rows are removed 
     725         
     726        global $wpdb; 
     727        $prefix = $wpdb->escape($prefix); 
     728        $blog_id = intval($blog_id); 
     729        $users = $wpdb->get_results( "SELECT umeta_id, user_id, meta_value FROM {$wpdb->usermeta} WHERE meta_key = '{$prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id" ); 
    718730 
     731        foreach ($users as $user) { 
     732                // find any usermeta capabilites that are roles, and insert them as user_role rows 
     733                $caps = unserialize($user->meta_value); 
     734                foreach ( $caps as $cap => $active ) { 
     735                        if ( is_role($cap) ) { 
     736                                if ($active) { 
     737                                        $role = strtolower($cap); 
     738                                        $wpdb->insert( $wpdb->user_role, array('blog_id' => $blog_id, 'user_id' => $user->user_id, 'role' => $role) ); 
     739                                } 
     740                                unset( $caps[$cap] ); 
     741                        } 
     742 
     743                } 
     744 
     745                // write any remaining caps as usermeta capabilities 
     746                $newcaps = maybe_serialize($caps); 
     747                $wpdb->update( $wpdb->usermeta, array('meta_value' => $newcaps), array('umeta_id' => $user->umeta_id) ); 
     748                wp_cache_delete($user->user_id, 'users'); 
     749        } 
     750} 
     751 
    719752// The functions we use to actually do stuff 
    720753 
    721754// General