web-dev-qa-db-fra.com

Plugin pour supprimer les éléments de menu de l’administrateur en fonction du rôle de l’utilisateur?

J'ai cherché haut et bas un plugin capable de supprimer/masquer les éléments de menu de l'administrateur, y compris les types d'articles et les taxonomies personnalisés, en fonction du rôle de l'utilisateur.

Chacun de ceux que j'ai essayés ne fait que masquer globalement, pas en fonction du rôle de l'utilisateur. D'autres plus complexes comme adminize n'affichent ni les types de publication ni les taxonomies personnalisés.

Dois-je écrire ma propre fonction ou existe-t-il un simple plugin que je néglige?

6
Wyck

Mettre à jour:

en relisant la réponse de Mike, je me suis de nouveau dit que vous pouviez ajouter une nouvelle fonctionnalité à un rôle et l'utiliser comme condition de retrait, afin que:

   // first add your role the capability like so
   // get the "author" role object
   $role = get_role( 'administrator' );

   // add "see_all_menus" to this role object
   $role->add_cap( 'see_all_menus' );

   //then remove menu items based on that
   function remove_those_menu_items( $menu_order ){
            global $menu;
            // check using the new capability with current_user_can
            if ( !current_user_can( 'see_all_menus' ) ) {
             foreach ( $menu as $mkey => $m ) {
                //custom post type name "portfolio"
                $key = array_search( 'edit.php?post_type=portfolio', $m );
                //pages menu
                $keyB = array_search( 'edit.php?post_type=page', $m );
                //posts menu
                $keyC = array_search( 'edit.php', $m );

                if ( $key || $keyB || $keyC )
                    unset( $menu[$mkey] );
             }
            }
            return $menu_order;
    }

 //Then just Hook that function to "menu_order"
        add_filter( 'menu_order', 'remove_those_menu_items' );

Ancienne réponse

Je suis tout à fait d’accord avec ce que Mike a posté, mais si vous n’êtes pas doué pour le codage personnalisé Jetez un coup d’œil à Editeur de menu Admin plugin.

il vous permet de définir les droits d'accès par niveau.

8
Bainternet

Il y a un plugin qui a créé pour la question exacte: Hide Admin Menu . Ce plugin peut:

  • Masquer les éléments du menu administrateur en fonction du rôle de l'utilisateur, y compris Administrateur et rôle de l'utilisateur personnalisé
  • Peut masquer les éléments de la barre d'administration, aussi
  • Peut exporter/importer les paramètres à utiliser sur d'autres sites

Une autre bonne chose de ce plugin est qu'il est intuitif et facile à utiliser.

2
Anh Tran

Bonjour @Wyck:

Je peux certainement apprécier vos besoins. J'ai eu des clients demandent la même chose. Malheureusement, WordPress lie les pages du menu d’administration (les sections de menu)} et les sous-pages de menu (les éléments de menu))aux fonctionnalités, pas aux rôles .

Cependant, il ne serait pas trop difficile d’écrire du code de plug-in qui vous permet d’affecter des options de menus d’administrateur à des rôles; votre script définit la capacité requise pour toutes les options de menu de manière à exiger une nouvelle capacité 'not-allowed', puis assigne votre code de manière sélective à la capacité 'read' par défaut à chaque option de menu pour laquelle le rôle de l'utilisateur actuel dispose de la capacité définie.

La grande question consiste alors à savoir comment représenter le mappage des rôles d’utilisateur en options de menu. Je pouvais voir que cela nécessitait une interface utilisateur admin assez élaborée. Bien sûr, si vous voulez simplement coder en dur un tableau qui définit quels rôles peuvent voir quoi, ce sera assez facile ...

1
MikeSchinkel

Cela ne conservera que quelques éléments de menu pour les non-administrateurs. La version de @Bainternet utilise add_cap, ce qui ne devrait être fait qu'une fois, lors de l'activation du thème ou du plugin.

add_action('admin_menu', function () {
    if (current_user_can('administrator')) {
        return;
    }

    /**
     * Keep only specific menu items and remove all others
     */
    global $menu;
    $hMenu = $menu;
    foreach ($hMenu as $nMenuIndex => $hMenuItem) {
        if (in_array($hMenuItem[2], array(
                                         'index.php',
                                         'edit.php?post_type=product',
                                    ))
        ) {
            continue;
        }
        unset($menu[$nMenuIndex]);
    }
}
0
tivnet