web-dev-qa-db-fra.com

Empêcher l'utilisateur administrateur de modifier/voir le super administrateur à partir de la liste des utilisateurs

Comment masquer mon super administrateur de la liste des utilisateurs? Mon client doit avoir la possibilité de créer des utilisateurs, mais pas de modifier/voir mon utilisateur super administrateur. Est-ce possible?

1
Carol

Je recommanderais ce qui suit:

Le rôle d'utilisateur Éditeur dans WordPress ne peut pas modifier les utilisateurs par défaut. Vous voudrez peut-être ajouter cette fonctionnalité aux clients que vous gardez en tant que "rédacteurs". Cela permettra à l'éditeur d'ajouter de nouveaux utilisateurs (créer de nouveaux utilisateurs), de supprimer des utilisateurs et de les modifier. Cela se fait en ajoutant des fonctionnalités au rôle Editeur avec 'add_cap'.

Cela permet aux éditeurs de gérer les utilisateurs

function wpse104808_editor_manage_users() {

    if ( get_option( 'wpse104808_add_cap_editor_once' ) != 'done' ) {

        // let editor manage users

        $edit_editor = get_role('editor'); // Get the user role
        $edit_editor->add_cap('edit_users');
        $edit_editor->add_cap('list_users');
        $edit_editor->add_cap('promote_users');
        $edit_editor->add_cap('create_users');
        $edit_editor->add_cap('add_users');
        $edit_editor->add_cap('delete_users');

        update_option( 'wpse104808_add_cap_editor_once', 'done' );
    }

}
add_action( 'init', 'wpse104808_editor_manage_users' );

Empêcher l'éditeur de supprimer un utilisateur administrateur

Ceci empêchera les éditeurs de supprimer, d’éditer ou d’ajouter de nouveaux administrateurs.

class wpse104808_user_caps {

  // Add our filters
  function wpse104808_user_caps(){
    add_filter( 'editable_roles', array(&$this, 'editable_roles'));
    add_filter( 'map_meta_cap', array(&$this, 'map_meta_cap'),10,4);
  }
  // Remove 'Administrator' from the list of roles if the current user is not an admin
  function editable_roles( $roles ){
    if( isset( $roles['administrator'] ) && !current_user_can('administrator') ){
      unset( $roles['administrator']);
    }
    return $roles;
  }
  // If someone is trying to edit or delete an
  // admin and that user isn't an admin, don't allow it
  function map_meta_cap( $caps, $cap, $user_id, $args ){
    switch( $cap ){
        case 'edit_user':
        case 'remove_user':
        case 'promote_user':
            if( isset($args[0]) && $args[0] == $user_id )
                break;
            elseif( !isset($args[0]) )
                $caps[] = 'do_not_allow';
            $other = new WP_User( absint($args[0]) );
            if( $other->has_cap( 'administrator' ) ){
                if(!current_user_can('administrator')){
                    $caps[] = 'do_not_allow';
                }
            }
            break;
        case 'delete_user':
        case 'delete_users':
            if( !isset($args[0]) )
                break;
            $other = new WP_User( absint($args[0]) );
            if( $other->has_cap( 'administrator' ) ){
                if(!current_user_can('administrator')){
                    $caps[] = 'do_not_allow';
                }
            }
            break;
        default:
            break;
    }
    return $caps;
  }

}

$wpse104808_custom_role = new wpse104808_user_caps();

Masquer l'administrateur de la liste d'utilisateurs

Voici 3 variantes pour masquer les utilisateurs de la liste des utilisateurs. Choisissez l'une des options suivantes:

Option 1: masquer des utilisateurs spécifiques de la liste des utilisateurs.

Si vous souhaitez choisir des identifiants individuels à masquer dans la liste des utilisateurs, utilisez ceci (remplacez '2,5,7,9' par les identifiants que vous souhaitez masquer)

add_action('pre_user_query','wpse104808_pre_user_query');
function wpse104808_pre_user_query($user_search) {

    $admin_ids = '2,5,7,9'; // REPLACE THESE NUMBERS WITH IDs TO HIDE.

    $user = wp_get_current_user();
    $admin_array = explode($admin_ids, ',');
    if ( ! in_array( $user->ID, $admin_array ) ) {
        global $wpdb;
        $user_search->query_where = str_replace('WHERE 1=1', "WHERE 1=1 AND {$wpdb->users}.ID NOT IN($admin_ids)",$user_search->query_where);

    }
}

Option 2: masquez tous les administrateurs de la liste des utilisateurs.

// Hide all administrators from user list.

add_action('pre_user_query','wpse104808_pre_user_query');
function wpse104808_pre_user_query($user_search) {

    $user = wp_get_current_user();

    if ( ! current_user_can( 'manage_options' ) ) {

        global $wpdb;

        $user_search->query_where = 
            str_replace('WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
                 SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                    WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
                    AND {$wpdb->usermeta}.meta_value NOT LIKE '%administrator%')", 
            $user_search->query_where
        );

    }
}

Liens connexes:
- Rôles et capacités
- add cap
- WP_Role::add_cap
- WP_User::add_cap

4
Jentan Bernardus
0
Krzysiek Dróżdż