23
Jan
09

Supprimer un menu dans l’administration


Ce qui est vraiment formidable avec WordPress, c’est que l’on peut presque tout faire! Ainsi, si vous souhaitez bloquer l’accès à certains menus pour certains utilisateurs dans l’administration, c’est tout à fait possible, et ce sans modifier le code du core.

On commence par supprimer le lien vers le menu dans la barre des menus en faisant un unset sur l’index correspondant dans la variable globale menu. Par exemple, pour bloquer l’accès à la modification du profil, je fais :

unset($menu[50]);

Pour savoir quel $menu[x] il faut unsetter, il faut regarder dans le fichier menu.php dans le répertoire wp-admin. Cette action aura pour effet de supprimer l’icône dans le menu d’admin.

Ce n’est pas suffisant car l’accès direct à la page est toujours possible pour celui qui en connaît l’url. Mais aucun problème, là encore, j’ai la solution! On faire un check sur la page en cours de chargement et si c’est une page pour laquelle on ne souhaite pas donner accès à l’utilisateur, on le redirige vers une autre page à laquelle on lui donne accès sinon, bonjour la boucle de redirection.

Voici le bout de code pour faire la manipulation. Ici je bloque l’accès à l’édition du profil pour les utilisateurs de niveau 0 et je les redirige vers le dashboard de l’admin :


$requesteduri = $_SERVER['REQUEST_URI'];
$destinationpage = get_option('siteurl') . '/wp-admin/index.php';
$position = strpos($requesteduri, '/wp-admin/profile.php');

if (($position != 0) && ($current_user->user_level == 0))
wp_safe_redirect($destinationpage);

Donc pour résumer, pour bloquer l’accès à une page dans l’admin :

1/ on supprime l’entrée dans le menu;

2/ on met en place une redirection pour empêcher l’accès direct.

Ces deux actions doivent être réalisées assez tôt dans le chargement de la page. Il faut donc faire un hook sur l’action plugins_loaded par exemple, ça fonctionnera bien comme ça.

wordpress-plugin-button Retour au sommaire du dossier sur l’écriture d’un plugin wordpress





14 commentaires pour “Supprimer un menu dans l’administration”
  1. jbj dit :

    Wow, bien joué! Avec ton accord, je serais bien tenté de le publier sur mon site anglophone wprecipes.com, avec crédit et lien bien entendu, comme il se doit.

  2. Olivier dit :

    Aucun problème si tu veux reprendre le bout de code et l’idée de fond de l’article (en reformulant à ta sauce). Par contre, si c’est pour faire un copier/coller sauvage avec un lien, je préfère pas car cela va faire du duplicate content et je vais encore me faire shooter par Google (ça m’est déjà arrivé). Merci 😉

  3. jbj dit :

    Aucun soucis, je ne reprends que le bout de code. Le site est en anglais, donc aucun risque de duplicate content pour toi 🙂

  4. Olivier dit :

    Ok cool, merci 😉

  5. christian dit :

    J’ai bien compris comment procéder pour neutraliser une option du menu, par contre je ne comprends pas dans quel fichier et où placer le code pour bloquer l’accès à profile.php pour les utilisateurs de niveau 0.
    Merci de m’éclairer.

  6. Olivier dit :

    Il faut créer un plugin où tu vas ajouter un hook pour l’admin head je pense et dans la fonction associée à ton hook, tu mets le code que j’ai mis.

  7. christian dit :

    Merci Olivier pour cette réponse utile et rapide.
    Bonne journée !

  8. sebastien dit :

    Bonjour et merci pour ton site.

    J’ai écrit dans le fichier function.php le code suivant

    // ajoute un bouton dans le menu du backoffice en se rapportant à la fonction supprimer_onglet
    add_action(‘admin_head’, ‘supprimer_onglet’);

    // la fonction menu_contact crée un bouton « webmaster » qui envoie sur la page « contact webdesigner » dont le contenu est écrit par la fonction « page_contact » (le bouton est visible aux users de niveau 1, c’est à dire tout le monde.
    function supprimer_onglet() {
    unset($menu[15]);

    $requesteduri = $_SERVER[‘REQUEST_URI’];
    $destinationpage = get_option(‘siteurl’) . ‘/wp-admin/index.php’;
    $position = strpos($requesteduri, ‘/wp-admin/profile.php’);

    if (($position != 7) && ($current_user->user_level == 7))
    wp_safe_redirect($destinationpage);

    }

    théoriquement ça devrait supprimer le menu « lines » mais ça ne le supprime pas. J’ai probablement fait une erreur. saurais-tu m’aider à trouver laquelle ?

  9. sebastien dit :

    le menu « liens » et non « lines »
    les commentaires dans le code sont sans interet.

  10. Olivier dit :

    Je ferais le hook plutôt du admin_menu que admin_head. Sinon, teste que $menu[15] existe et log dans un fichier sa valeur pour voir. D’une version à une autre, le menu item a pu changer…

  11. sebastien dit :

    J’ai vérifié le numero du menu dans menu.php comme tu le disais.

    J’ai changé admin_head pour admin_menu, mais l’onglet est toujours là.

    Pour le reste j’avoue que je ne sais pas vérifier que $menu[15] existe et loguer dans un fichier sa valeur.

    Pourrais-tu m’aiguiller ? Merci 🙂

  12. Olivier dit :

    il faut que tu ajoutes un global $menu au début de ta fonction…

  13. sebastien dit :

    Génial, merci beaucoup, ça fonctionne.

    j’en profite donc pour partager ce code.

    add_action(‘admin_menu’, ‘suppronglet’);

    // la fonction suppronglet zappe l’onglet « lien »
    function suppronglet() {

    global $menu;
    unset($menu[15]);

    $requesteduri = $_SERVER[‘REQUEST_URI’];
    $destinationpage = get_option(‘siteurl’) . ‘/wp-admin/index.php’;
    $position = strpos($requesteduri, ‘/wp-admin/profile.php’);

    if (($position != 7) && ($current_user->user_level == 7))
    wp_safe_redirect($destinationpage);
    }

    En revanche j’ai essayé avec if ($current_user->user_level != 10)) global $menu; unset($menu[15]);

    afin que le menu ne soit pas supprimer quand on se connecte en administrateur mais ça ne fonctionne pas… tant pis, il faut vraiment que j’apprenne le php…

    Encore merci Olivier !

  14. Olivier dit :

    Tu as défini ton global $current_user? Tu as rempli ensuite le $current_user avec get_currentuserinfo() avant de tester le user_level?


L'autre monde | Thème liquide par Olivier