web-dev-qa-db-fra.com

Supprimer la possibilité d'accéder à certains menus de l'administrateur

J'essaie de supprimer certaines fonctionnalités d'administration pour un utilisateur ayant le rôle de contributeur. Ce que je veux dire par supprimer certaines fonctionnalités de l'administrateur, c'est les empêcher de voir certains éléments du menu de l'administrateur, tels que les commentaires, les outils, les médias, etc. J'ai réussi à supprimer les éléments que je veux du menu admin, en utilisant ce code:

function remove_menus(){

$author = wp_get_current_user();
if(isset($author->roles[0])){ 
    $current_role = $author->roles[0];
}else{
    $current_role = 'no_role';
}

if($current_role == 'contributor'){  
  remove_menu_page( 'index.php' );                  //Dashboard
  remove_menu_page( 'edit.php' );                   //Posts
  remove_menu_page( 'upload.php' );                 //Media
  remove_menu_page( 'tools.php' );                  //Tools
  remove_menu_page( 'edit-comments.php' );               //Comments

}

}
add_action( 'admin_menu', 'remove_menus' );

Cela fonctionne un régal. Le problème auquel je suis confronté est que je peux simplement ajouter manuellement la chaîne de requête à l'URL, par exemple /wp-admin/edit.php, ce qui me mènera à l'écran d'édition post. Est-ce que quelqu'un connaît un moyen d'empêcher l'accès à ces pages, ainsi que de les cacher dans le menu administrateur?

1
RoseCoder

Je l'ai compris à la fin et voici le code que j'ai utilisé:

function restrict_menus() {
    $author = wp_get_current_user();

    if( isset( $author->roles[0] ) ) { 
        $current_role = $author->roles[0];
    } else {
        $current_role = 'no_role';
    }

    if( 'contributor' == $current_role ) {  
        $screen = get_current_screen();
        $base   = $screen->id;


        if( 'edit-post' == $base || 'upload' == $base || 'tools' == $base || 'edit-comments' == $base ) {
            wp_die( 'Cheatin’ uh?' );
        }
    }
}
add_action( 'current_screen', 'restrict_menus' );
3
RoseCoder

J'utilise généralement (et recommande) le plugin Members . L’UI est très facile à utiliser et vous offre l’avantage supplémentaire de stocker votre logique de rôle/autorisation dans la base de données (plutôt que le code), ce qui facilite les modifications "à la volée".

Ce plugin vous permet même de créer un rôle personnalisé (peut-être que vous voulez en inventer un appelé "Photo Editor" ou "Comment Approver" etc.) et limiter les menus auxquels ils peuvent accéder et auxquels ils peuvent accéder. Je pense que cela fera exactement ce que vous voulez.

1
Jared Cobb

Vous pouvez créer un rôle personnalisé comme suggéré par s_da_hum ou supprimer des fonctionnalités du rôle de contributeur en ajoutant ce code à votre fichier functions.php de thèmes enfants.

add_action( 'init', 'wpsites_remove_contributor_capabilities' );

function wpsites_remove_contributor_capabilities() {

$contributor = get_role( 'contributor' );

$caps = array(
    'edit_posts',
    'delete_posts',
);

foreach ( $caps as $cap ) {

    $contributor->remove_cap( $cap );
    }
}

Source https://codex.wordpress.org/Function_Reference/add_role

1
Brad Dalton

Je sais que cette question a déjà été répondue et qu'elle est ancienne. Cependant, je souhaitais proposer une solution alternative. Voici comment je l'ai fait dans un plugin que j'ai écrit il y a longtemps (j'ai modifié mon code pour utiliser vos pages).

Parce que vous souhaitez restreindre le rôle de contributeur, vous pouvez utiliser fonctionnalités du rôle . Les contributeurs ne peuvent pas publier de messages, vous pouvez donc procéder comme suit.

Partie 1: Supprimer des éléments du menu Admin

add_action( 'admin_menu', 'tcd_remove_admin_menus' );
function tcd_remove_admin_menus() {

    // don't do anything if the user can publish posts
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // remove these items from the admin menu
    remove_menu_page( 'edit.php' );          // Posts
    remove_menu_page( 'upload.php' );        // Media
    remove_menu_page( 'tools.php' );         // Tools
    remove_menu_page( 'edit-comments.php' ); // Comments

}

Comme vous l'avez dit cependant, cela n'empêche pas l'utilisateur de simplement entrer dans l'URL directe de la page. Voici comment j'ai écrit ma restriction de page:

Partie 2: Restreindre l'accès aux pages d'administration

add_action( 'current_screen', 'tcd_restrict_admin_pages' );
function tcd_restrict_admin_pages() {

    // don't do anything if the user can publish posts
    if ( current_user_can( 'publish_posts' ) ) {
        return;
    }

    // retrieve the current page's ID
    $current_screen_id = get_current_screen()->id;

    // determine which screens are off limits
    $restricted_screens = array(
        'edit',
        'upload',
        'tools',
        'edit-comments',
    );

    // Restrict page access
    foreach ( $restricted_screens as $restricted_screen ) {

        // compare current screen id against each restricted screen
        if ( $current_screen_id === $restricted_screen ) {
            wp_die( __( 'You are not allowed to access this page.', 'tcd' ) );
        }

    }

}

Pour moi, utiliser des capacités de rôle et un tableau a rendu le travail plus facile. Quoi qu'il en soit, j'espère que cette méthode est utile.

À votre santé.

0
Mr. Curious