Насправді це досить просто. Потрібно фільтрувати в map_meta_caps
редакторах і не дозволяти їм створювати / редагувати адміністратори та видаляти роль адміністратора з масиву "редагованих ролей". Цей клас, як плагін або у вашому файлі function.php, зробить це:
class JPB_User_Caps {
// Add our filters
function __construct(){
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();
EDIT
Гаразд, я роздивився, чому це дозволяє пропускати користування видаленням. Схоже, видалення_користувача обробляється трохи інакше, ніж редагування_користувача; Я змінив метод map_meta_cap, щоб обійти це. Я перевірив версію 3.0.3, і це не дозволить комусь, окрім адміністраторів, фактично видаляти, редагувати чи створювати адміністратора.
EDIT 2
Я оновив код, щоб відобразити відповідь @ bugnumber9 нижче. Будь ласка, ідіть, дайте цю відповідь підсумком!