web-dev-qa-db-fra.com

Interdire aux utilisateurs d'un rôle personnalisé de supprimer ou d'ajouter des administrateurs?

( Note du modérateur: Le titre d'origine était "Restrictions relatives au rôle de l'utilisateur personnalisé")

Un projet sur lequel je travaille nécessite la création de deux nouveaux rôles d'utilisateur, l'un pour le propriétaire du site Web et l'autre pour les agents de la société.

En tant que propriétaire du site Web, je cherchais simplement un moyen d'empêcher les utilisateurs de ce groupe de modifier les paramètres du site principal tout en permettant de modifier tous les autres paramètres.

Le code ci-dessous semble fonctionner parfaitement pour tout ce qui n'est pas la zone de gestion des utilisateurs. Je voulais que les utilisateurs de ce groupe puissent ajouter/modifier des utilisateurs de sites Web MAIS je me heurte à un problème, c’est que les utilisateurs de ce groupe ont actuellement la possibilité de créer des utilisateurs dans le "Administrateur" et ils sont également capables de supprimer des "Administrateurs" existants .

Ce que je recherche, c’est un moyen de modifier le code ci-dessous afin que de tels utilisateurs ne puissent PAS supprimer ou modifier un compte utilisateur défini comme "Administrateur" et empêcher l’utilisateur de pouvoir créer un nouveau compte administrateur.

Est-ce que quelqu'un sait comment cela peut être fait?

// 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 );
}
6

Bonjour @ NetConstructor:

Je pense que c'est ce dont vous avez besoin. Notez que je n'ai pas inclus la configuration complète de votre rôle 'website_owner', mais simplement l'ajout d'une nouvelle fonctionnalité appelée 'manage_administrators'.

De plus, j'ai seulement essayé de supprimer le lien "Supprimer" de tout utilisateur n'ayant pas la capacité 'manage_administrators' (que vous devrez ajouter au rôle d’administrateur, bien sûr) et j’ai également simplement supprimé l’administrateur en tant qu’option de rôle sur le "Ajouter un nouvel utilisateur" page. Je n'ai pas essayé de m'assurer qu'ils ne puissent pas supprimer ou ajouter des administrateurs via une méthode néfaste, et je n'ai désactivé aucune autre fonctionnalité qui pourrait leur permettre d'ajouter ou de supprimer des administrateurs. Cela dit, c'est peut-être suffisant?

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
MikeSchinkel

Je crois que cela est maintenant censé être fait en utilisant map_meta_cap :

Par exemple, pour bloquer la suppression ou la modification de l'utilisateur admin ayant l'id 1, procédez comme suit:

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 );

Vous pouvez ajouter toutes les fonctionnalités supplémentaires que vous souhaitez bloquer au tableau $blocked_caps.

J'ajoute également ceci pour me cacher de la page wp-admin/users.php. Il serait probablement préférable de désactiver l'utilisateur avec php, mais cela ne change pas vraiment la situation car l'administrateur ne peut pas être édité de toute façon si vous utilisez la fonction ci-dessus.

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
Bryan Willis