<?php
function filter_editable_roles($roles) {
foreach ($roles as $role => $details) :
foreach ($details['capabilities'] as $capability => $value) :
if (!current_user_can($capability)) :
unset ($roles[$role]);
break;
endif;
endforeach;
endforeach;
return $roles;
}
add_filter('editable_roles', 'filter_editable_roles');
function check_user_editable($allcaps, $caps, $args) {
if ($caps[0] == 'edit_users' && $args[2]) :
global $user_object, $wp_roles;
if (!$user_object) $user_object = new wp_user($args[2]);
if ($user_object->ID != $args[2]) return $allcaps;
$edited_user_caps = $user_object->allcaps;
$edited_user_roles = $user_object->roles;
$checked_roles = array();
foreach ($edited_user_roles as $role => $name) :
$rolecaps = $wp_roles->roles[$name]['capabilities'];
foreach($rolecaps as $capability => $value) :
if (!current_user_can($capability)) :
unset ($allcaps['edit_users']);
return $allcaps;
endif;
endforeach;
$checked_roles[] = $name;
endforeach;
foreach ($edited_user_caps as $capability => $value) :
if (in_array($capability, $checked_roles)) :
continue;
elseif (!current_user_can($capability)) :
unset ($allcaps['edit_users']);
return $allcaps;
endif;
endforeach;
endif;
return $allcaps;
}
add_filter('user_has_cap', 'check_user_editable', 10, 3)
?>