[wp-hackers] User Capabilities

Owen Winkler ringmaster at midnightcircus.com
Sun Jul 10 18:39:17 GMT 2005


Ryan Boren wrote:

>For plugin back compat, we'll need to add some code that sets an
>"equivalent user level" whenever we change a user's role.
>  
>
What do you think about adding a param to add_role() that specifies an 
equivalent user level?  Not WP_User::set_role(), but WP_Roles::add_role().

The default set of roles would already have built-in equivalent user 
levels (via "level_x" caps).  A role itself defines its level, and any 
future roles that anyone might define will automatically (if added 
through this API rather than direct database additions) be backwards 
compatible, since the system will add the appropriate "level_x" caps 
automatically. 

Like this:

$wp_roles->add_role('foo', array('eat_pie'=>true),'Foo',3);

executes:

function add_role($role, $capabilities, $display_name, $user_level = 0) {
    for($z=0;$z<=$user_level;$z++) $capabilities["level_{$z}"] = true;  
//New line
    $this->roles[$role] = array('name' => $display_name,
                                                            
'capabilities' => $capabilities);
    update_option($this->role_key, $this->roles);
    $this->role_objects[$role] = new WP_Role($role, $capabilities);
    $this->role_names[$role] = $display_name;
}


When the system updates a user's role, the WP_User class would filter 
through allcaps (after the role change) looking for the highest 
"level_x" and then use that to set the user_level for backwards 
compatibility.

Something like:

function level_reduction($max, $item) {
    if(preg_match('/^level_(10|[0-9])$/i', $item, $matches)) {
        $level = intval($matches[1]);
        return max($max, $level);
    } else {
        return $max;
    }
}
function update_user_level_from_caps() {
    global $table_prefix;
    $this->data->user_level = array_reduce(array_keys($this->allcaps), 
array(&$this, 'level_reduction'), 0);
    update_usermeta($this->id, $table_prefix.'user_level', 
$this->data->user_level);
}

This would help avoid a hard-coded switch statement that converts 
default roles into user levels, which wouldn't accomodate custom role 
schemes.  It also doesn't really discourage people from using the old 
user_level permissions, because everything would still work pretty well 
that way.

Grr.  This backwards compatibility thing is a bear.  It's almost not 
worth the trouble.

Similarly - I'm just noting this now - capabilities.php probably 
shouldn't be using translate_level_to_role() from upgrade_functions.php, 
since the roles in the switch might not exist in a custom role scheme.  
In what case would get_role() be used with a numeric argument anyway?

Owen




More information about the wp-hackers mailing list