The UI select element
On user-edit.php
, you see the drop-down in the UI. The drop down <select>
wrapper is hard coded.
Then the admin interface does a nifty thing 1) according to the inline comment: // Get the highest/primary role for this user
. In fact it is getting the first role, that was assigned to the user (this we have to keep in mind).
Then there’s basically only a call to wp_dropdown_roles()
. This function doesn’t do anything else, than looping through the available roles and wrapping them inside <option>
elements. But, there’s one kool thing it does: It uses the roles retrieved by get_editable_roles()
. And here comes the magic! A filter, for the global $wp_roles->roles
. By default this returns all roles, but you can jump in and simply unset whatever you want.
// Add this as mu-plugin
function wpse32738_get_editable_roles( $editable_roles )
{
if ( current_user_can( 'client' ) )
// unset whatever you need here.
return $editable_roles;
}
add_filter( 'editable_roles', 'wpse32738_get_editable_roles' );
1) Roles are a “flat” system. A role can have capabilities that overrule other capabilities.