Prevent an Editor from adding Administrator users

Would you like for the client to have the ability to create new user as with the roles of a Contributor, Subscriber, Editor and Author, but NOT Administrator. The new users the client creates should not have the Administrator role.

It’s actually pretty easy. You need to filter into map_meta_caps and stop editors from creating/editing admins, and remove the administrator role from the ‘editable roles’ array. This class, as a plugin or in your theme’s functions.php file would do it:


<?php
// Remove the ability to add administrators from the 'add users' capability
class JPB_User_Caps {

 // Add our filters
 function JPB_User_Caps(){
 add_filter( 'editable_roles', array(&$this, 'editable_roles'));
 add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'),10,4);
 }

 // Remove 'Administrator' from the list of roles if the current user is not an admin
 function editable_roles( $roles ){
 if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
 unset( $roles['administrator']);
 }
 return $roles;
 }

 // If someone is trying to edit or delete and admin and that user isn't an admin, don't allow it
 function map_meta_cap( $caps, $cap, $user_id, $args ){

 switch( $cap ){
 case 'edit_user':
 case 'remove_user':
 case 'promote_user':
 if( isset($args[0]) && $args[0] == $user_id )
 break;
 elseif( !isset($args[0]) )
 $caps[] = 'do_not_allow';
 $other = new WP_User( absint($args[0]) );
 if( $other->has_cap( 'administrator' ) ){
 if(!current_user_can('administrator')){
 $caps[] = 'do_not_allow';
 }
 }
 break;
 case 'delete_user':
 case 'delete_users':
 if( !isset($args[0]) )
 break;
 $other = new WP_User( absint($args[0]) );
 if( $other->has_cap( 'administrator' ) ){
 if(!current_user_can('administrator')){
 $caps[] = 'do_not_allow';
 }
 }
 break;
 default:
 break;
 }
 return $caps;
 }

}

$jpb_user_caps = new JPB_User_Caps();
?>

Revisions

There are no revisions for this post.

Tags: , ,

No comments yet.

Leave a Reply