Запретить пользователям Пользовательской роли Удалять или добавлять Администраторов?


( Примечание модератора: Первоначальное название было "Пользовательские ограничения ролей пользователей")

Проект, над которым я работаю, требует, чтобы я создал две новые роли пользователей - одну для владельца веб-сайта, а другую для агентов компании.

С ролью пользователя владельца веб-сайта я просто искал способ ограничить пользователей в этой группе от изменения основных настроек сайта, имея при этом доступ для изменения всех остальных настроек.

Приведенный ниже код кажется, он отлично работает для всего, кроме области управления пользователями. Я действительно хотел, чтобы пользователи этой группы могли добавлять/изменять пользователей веб-сайта, НО там, где я сталкиваюсь с проблемой, пользователи этой группы в настоящее время имеют возможность создавать пользователей в категории "Администратор", и они также могут удалять существующих "Администраторов".

Я ищу способ изменить приведенный ниже код, чтобы такие пользователи не могли удалять или изменять учетную запись пользователя который установлен как "Администратор" и запрещает пользователю создавать новую учетную запись администратора.

Кто-нибудь знает, как это можно сделать?

// 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 );
}
Author: NetConstructor.com, 2010-11-08

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);
  }
}
 9
Author: MikeSchinkel, 2010-11-12 00:04:57

Я полагаю, что теперь это должно быть сделано с помощью 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');
 0
Author: Bryan Willis, 2016-01-09 20:44:57