Les utilisateurs d'un Interdire rôle personnalisé à partir ajout ou suppression des administrateurs?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/3777

Question

( Note du modérateur: Le titre original était "sur mesure Restrictions de rôle d'utilisateur")

Un projet sur lequel je travaille me demande de créer deux nouveaux rôles utilisateur -. Un pour le propriétaire du site et l'autre pour les agents de la société

Avec le rôle propriétaire site utilisateur Je cherchais un moyen de limiter les utilisateurs de ce groupe de modifier les paramètres du site de base tout en ayant accès à modifier tous les autres paramètres.

Le code ci-dessous semble fonctionner parfaitement pour tout autre que la zone de gestion des utilisateurs. Je ne les utilisateurs faute de ce groupe pour pouvoir ajouter / modifier des utilisateurs de site Web, mais où je courais un problème est que les utilisateurs de ce groupe ont actuellement la possibilité de créer des utilisateurs dans le « Administrateur » catégorie et ils sont également en mesure de supprimer existant « Administrateurs » .

Ce que je cherche est un moyen de modifier le code ci-dessous afin que ces utilisateurs ne peuvent pas supprimer ou modifier un compte d'utilisateur qui est défini comme « Administrateur » et empêcher l'utilisateur d'être en mesure de créer un compte administrateur.

Quelqu'un sait comment cela peut se faire?

// 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 );
}
Était-ce utile?

La solution

Salut @NetConstructor:

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

En outre, je n'essayé d'enlever le « Supprimer » lien de tous les utilisateurs qui ne possèdent pas la capacité 'manage_administrators' (que vous devrez ajouter au rôle d'administrateur, de bien sûr) et je simplement a également supprimé la administrateur comme option de rôle sur le "Ajouter un nouvel utilisateur" page. Je n'ai pas essayé d'assurer qu'ils ne peuvent pas supprimer ou ajouter des administrateurs via une méthode infâmes, et je ne désactiver tout autre élément qui pourrait leur permettre d'ajouter ou administrateurs suppression. Cela dit, peut-être cela suffit?

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

Autres conseils

  

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

Par exemple, pour supprimer des blocs ou de modifier l'utilisateur admin qui a un identifiant de 1 vous faire ceci:

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 des fonctionnalités supplémentaires que vous souhaitez bloquer au tableau de $blocked_caps.

Je voudrais également ajouter ceci dans pour me cacher de la page wp-admin/users.php. Il serait probablement mieux Décharger l'utilisateur avec php, mais il ne fait pas vraiment différent car l'administrateur ne peut pas être modifiée 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');
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top