Запретить пользователям Пользовательской роли Удалять или добавлять Администраторов?
( Примечание модератора: Первоначальное название было "Пользовательские ограничения ролей пользователей")
Проект, над которым я работаю, требует, чтобы я создал две новые роли пользователей - одну для владельца веб-сайта, а другую для агентов компании.
С ролью пользователя владельца веб-сайта я просто искал способ ограничить пользователей в этой группе от изменения основных настроек сайта, имея при этом доступ для изменения всех остальных настроек.
Приведенный ниже код кажется, он отлично работает для всего, кроме области управления пользователями. Я действительно хотел, чтобы пользователи этой группы могли добавлять/изменять пользователей веб-сайта, НО там, где я сталкиваюсь с проблемой, пользователи этой группы в настоящее время имеют возможность создавать пользователей в категории "Администратор", и они также могут удалять существующих "Администраторов".
Я ищу способ изменить приведенный ниже код, чтобы такие пользователи не могли удалять или изменять учетную запись пользователя который установлен как "Администратор" и запрещает пользователю создавать новую учетную запись администратора.
Кто-нибудь знает, как это можно сделать?
// CREATE CUSTOM - SITE OWNER - USER ROLE WITH CUSTOM CAPABILITIES
if (!get_role('website_owner')) {
//let's use the editor as the base capabilities
$caps = get_role('editor')->capabilities;
$caps = array_merge( $caps, array(
'install_plugins' => false,
'activate_plugins' => false,
'update_plugins' => false,
'delete_plugins' => false,
'list_users' => true,
'add_users' => true,
'create_users' => true,
'edit_users' => true,
'delete_users' => true,
'remove_users' => true,
'unfiltered_upload' => true,
'install_themes' => false,
'update_themes' => false,
'delete_themes' => false,
'switch_themes' => false,
'edit_theme_options' => true,
'manage_options' => false,
'import' => false,
'update_core' => false,
'edit_dashboard' => false,
'gravityforms_view_entries' => true,
'gravityforms_edit_entries' => true,
'gravityforms_delete_entries' => true,
'gravityforms_export_entries' => true,
'gravityforms_view_entry_notes' => true,
'gravityforms_edit_entry_notes' => true,
'gravityforms_feed' => true,
)); //adding new capabilities.
// Ref: http://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table
add_role( 'website_owner', 'Website Owner', $caps );
}
2 answers
Привет@netconstructor:
Я думаю, что это то, что вам нужно. Обратите внимание, что я не включил полную настройку вашей роли 'website_owner'
, просто добавил новую возможность под названием 'manage_administrators'
.
Кроме того, я только попытался удалить ссылку "Удалить" у всех пользователей, у которых нет возможности 'manage_administrators'
(которую вам, конечно, нужно будет добавить в роль администратора), и я также просто удалил Администратора в качестве опции роли в "Добавить новый Пользователь" страница. Я не пытался гарантировать, что они не смогут удалять или добавлять администраторов каким-либо нечестивым способом, и я не отключал никаких других функций, которые могли бы позволить им добавлять или удалять администраторов. Тем не менее, может быть, этого достаточно?
add_action('user_row_actions','yoursite_user_row_actions',10,2);
function yoursite_user_row_actions($actions, $user_object) { // remove the ability to delete an administrator
global $pagenow;
if ($pagenow=='users.php' && isset($user_object->caps['administrator']) && !current_user_can('manage_administrators'))
unset($actions['edit']);
unset($actions['delete']);
return $actions;
}
add_action('editable_roles','yoursite_editable_roles');
function yoursite_editable_roles($all_roles) { // remove the ability to add an administrator
global $pagenow;
if (in_array($pagenow,array('user-edit.php','user-new.php')) &&
!current_user_can('manage_administrators'))
unset($all_roles['administrator']);
return $all_roles;
}
add_action('admin_init','yoursite_admin_init');
function yoursite_admin_init() {
$wp_roles = new WP_Roles();
$wp_roles->use_db = true;
$administrator = $wp_roles->get_role('administrator');
if (!$administrator->has_cap('manage_administrators'))
$wp_roles->add_cap('administrator','manage_administrators');
$website_owner = $wp_roles->get_role('website_owner');
if (!$website_owner) {
//let's use the editor as the base capabilities
$caps = get_role('editor')->capabilities;
$caps = array_merge( $caps, array(
'install_plugins' => false,
'activate_plugins' => false,
'update_plugins' => false,
'delete_plugins' => false,
'list_users' => true,
'add_users' => true,
'create_users' => true,
'edit_users' => true,
'delete_users' => true,
'remove_users' => true,
'unfiltered_upload' => true,
'install_themes' => false,
'update_themes' => false,
'delete_themes' => false,
'switch_themes' => false,
'edit_theme_options' => true,
'manage_options' => false,
'import' => false,
'update_core' => false,
'edit_dashboard' => false,
'gravityforms_view_entries' => true,
'gravityforms_edit_entries' => true,
'gravityforms_delete_entries' => true,
'gravityforms_export_entries' => true,
'gravityforms_view_entry_notes' => true,
'gravityforms_edit_entry_notes' => true,
'gravityforms_feed' => true,
'manage_administrators' => false,
));
$wp_roles->add_role('website_owner','Website Owner',$caps);
}
}
Я полагаю, что теперь это должно быть сделано с помощью
map_meta_cap
:
Например, чтобы заблокировать удаление или редактирование пользователя-администратора с идентификатором 1, вы должны сделать это:
add_filter('map_meta_cap', function( $required_caps, $cap, $user_id, $args ){
$protected_user = 1; // ID of admin user you want to block from being edited
if ( $user_id === $protected_user ) // Don't block caps if current user = protected user
return $required_caps;
$blocked_caps = array(
'delete_user',
'edit_user',
'remove_user'
);
if ( in_array( $cap, $blocked_caps ) && $args[0] === $protected_user )
$required_caps[] = 'do_not_allow';
return $required_caps;
}, 10, 4 );
Вы можете добавить любые дополнительные возможности, которые вы хотите заблокировать, в массив $blocked_caps
.
Я также добавляю это, чтобы скрыть себя от страницы wp-admin/users.php
. Вероятно, было бы лучше сбросить пользователя с php, но на самом деле это не меняет ситуацию, так как администратор в любом случае не может быть отредактирован, если вы используете вышеуказанную функцию.
function hide_admin_user_bw() {
?>
<style type="text/css">
.users-php tr#user-1 {
display: none!important;
}
.users-php li.administrator {
display: none!important;
}
</style>
<?php
}
add_action('admin_head-users.php', 'hide_admin_user_bw');