9
Jan
09

Ajouter un menu dans l’interface d’administration de WordPress


WordPress dispose d’une interface d’administration particulièrement bien faite. Pourquoi ne pas s’appuyer dessus pour l’enrichir de menus qui permettront d’accéder aux fonctionnalités de votre plugin?

Pour cela, on va utiliser des hooks (crochets). En fait, cela revient à ajouter dans une table un pointeur de fonction vers la fonction qui génèrera votre menu. WordPress saura que lorsqu’on clique sur ce menu, il doit faire appel à telle ou telle fonction. C’est aussi simple que cela.

Mais venons en aux fonctions utiles pour faire cette association :

if (function_exists('add_options_page'))
{
add_options_page('Plugin Options', 'Mon plugin', 10, __FILE__, 'mon_plugin_admin_menu');
}


if (function_exists('add_menu_page'))
{
add_menu_page('Mon Plugin', 'Mon Plugin', 10, __FILE__, 'mon_plugin_management_menu');
}


if (function_exists('add_submenu_page'))
{
add_submenu_page(__FILE__,'Ajouter', 'Ajouter', 10, __FILE__, 'mon_plugin_management_menu');


add_submenu_page(__FILE__,'Supprimer', 'Supprimer', 10, 'Supprimer', 'mon_plugin_remove_menu');
}

Déjà à chaque fois, je teste si la fonction WordPress existe avec la fonction function_exists. Si elle n’existe pas, inutile d’aller plus loin, ça ne fonctionnera pas, c’est que votre installation de WordPress a un problème ou que votre plugin est mal interfacé.

Ensuite, on a trois fonctions pour ajouter des menus :

  • add_options_page : ajoute une page dans le menu des réglages
  • add_menu_page : ajoute un top level menu (au même niveau que articles, médias et liens par exemple)
  • add_submenu_page : ajoute un sous menu au top level menu désigné.

Le code pris en exemple ci-dessus va générer une page d’options et un top level menu avec deux sous-menus.

Voici le descriptif des paramètres des fonctions :

add_options_page('Titre de la page', 'Intitulé dans la liste des menus', niveau d'accès, fichier php, fonction à appeler);

add_menu_page('Titre de la page','Intitulé dans la liste des menus', niveau d'accès, fichier php, fonction à appeler, icône);

add_submenu_page(fichier php parent,'Titre de la page','Intitulé dans la liste des menus', niveau d'accès, fichier php, fonction à appeler);

Le niveau d’accès correspond au niveau de privilèges qu’un utilisateur doit avoir pour pouvoir accéder à ce menu. Allez faire un petit tour sur cette page si vous ne savez pas quel chiffre mettre. La valeur 10 correspond à un utilisateur administrateur. Donc tous les niveaux inférieurs à 10 ne verront pas ce menu.

Le fichier php est le fichier source contenant la fonction à associer à ce menu. Si c’est le fichier de votre plugin, il suffit de mettre __FILE__.

Si vous ajoutez un top level menu, vous pouvez spécifier un chemin d’accès à un fichier d’icône (à partir de la version 2.7).

D’une manière générale, le premier sous-menu d’un top level menu et le top level menu feront appel à la même fonction. C’est le fonctionnement classique de WordPress. Pour obtenir ce fonctionnement, il faut que la fonction appelée soit la même pour le premier sous-menu créé et le top level menu.

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





23 commentaires pour “Ajouter un menu dans l’interface d’administration de WordPress”
  1. Valentin dit :

    Interressant… mais il manque cruellement une liste de toute les parties où l’ont peut y ajouter son plugin… Exemple : Comment insérez un texte ou un menu dans tels ou tels pages de l’admin, sur le dashboard, dans la zone de réglage et tous les autres…

    A+ 🙂

  2. Olivier dit :

    Je sais pas si tu as lu le dossier en entier mais il y a un lien vers la DB des hooks…

    Avec les divers exemples fournis, cela donne pas mal de pistes pour commencer. Le but n’était pas de faire une encyclopédie du plugin wordpress avec toutes les possibilités, c’est un peu impossible à faire…

  3. sebastien dit :

    Olivier,

    J’ai dans un theme une page de reglage qui est gérée par cette ligne :
    add_theme_page(‘reglages’, ‘reglages’, ‘edit_themes’, basename(__FILE__), ‘mytheme_admin’);
    Le paramètre « edit_themes » ma permet d’afficher le nom de la page dans le menu « apparence » de la sidebar d’admin. Mais j’aimerais le mettre dans le menu « article » ou « media ». Je ne trouve pas l’info dans la DB des hooks. Est-ce que tu sais comment faire ?

    Merci.

  4. Olivier dit :

    Au lieu d’utiliser add_theme_page, il faut utiliser une autre fonction dont je ne connais pas le nom par cœur. Fais une recherche sur Google sur php xref add_theme_page, cela va te lister toutes les fonctions du Core. Tu devrais y trouver ton bonheur.

  5. Sébastien dit :

    merci ! Effectivement j’ai trouvé mon bonheur.

    Je t’explique : en fait j’avais essayé pas mal de choses et j’avais notamment réussi à mettre le nom de la page dans le menu « apparence ». ce qui me permettait de rendre cette page de réglage visible pour les users connecté en « editor » et non en admin.
    or le problème était que la page en question est un form dont on peut changer les valeurs, mais ça ne marchait pas en « editor ». On ne pouvait pas modifier les valeurs.
    J’imagine qu’il fallait être dans le menu « media » pour que ça marche car,là, avec add_media_page (trouvé grace à toi) ça marche nickel.
    Merci donc !

    ps : je précise que je suis totalement autodidacte, ce qui explique peut-être mon modeste niveau…

  6. Olivier dit :

    Ravi que tu aies trouvé ton bonheur! Sache que je ne suis pas né en connaissant le php et wp 😉

    j’ai commencé à regarder sous le couvercle de manière sérieuse en début d’année… Il suffit juste de bien maitriser Google 😉

  7. sebastien dit :

    wahou ! Mais tu étais dans le domaine de l’informatique, du code, de l’internet etc… avant ça ?

  8. Olivier dit :

    Oui à la base, j’ai une formation d’informaticien et j’ai fait bcp de C il y a dix ans lors de mes études mais depuis plus rien et je n’avais pas touché au php avant cette année. Ceci dit, c’est vrai que la syntaxe ressemble un peu à celle du C (je dis « un peu ») car sinon je vais avoir 50 commentaires enflammés des différentes chapelles de programmeurs voulant défendre l’unicité de leur patrie 😉

  9. sebastien dit :

    Ok, ça fait quand même des bases solides… pour ma part je suis architecte (batiment) de formation… et j’ai appris le html et le css tout seul il y a 2 ans. Et maintenant je suis webdesigner indépendant 🙂
    J’essaye de me débrouiller avec le code wordpress mais faut vraiment que j’apprenne le php

  10. Olivier dit :

    Je sais pas si ça fait une base solide, cela crée peut être des automatismes et la courbe d’apprentissage est plus rapide. Le meilleur moyen pour apprendre est de tenter de créer des petits programmes de plus en plus complexes. Cela permet d’apprendre sans se décourager… Je n’imaginais pas un jour faire de l’ajax avec du jquery et du js mais en y allant progressivement, rien d’impossible…

  11. Anthony dit :

    Bonjour, J’ai cette erreur et je ne sais pas par ou chercher je ne comprends pas.

    Si quelqu’un à une idée ?

    Voici l’erreur (qui se produit lors de l’activation du plugin):

    L’extension a généré 264 caractères d’affichage inattendu lors de l’activation. Si vous voyez un message « Les en-têtes ont déjà été envoyés », des problèmes avec les flux de syndication ou d’autres erreurs, essayez de désactiver ou enlever cette extension.

  12. Olivier dit :

    Le plugin produit un output inattendu, il faut le désactiver et voir quelle partie du code génère cet output…

  13. Hervé dit :

    Bonjour,

    Je souhaite rajouter « uniquement » !! un menu avec des sous-menus pointant sur des des fichiers php mais qui permettent d’afficher le contenu dans la partie centrale à gauche.

    Par exemple sous le menu « réglages »
    Rajout d’un autre menu « MonMenu » avec des liens
    – mes nouvelles
    – mon aide

    Est-ce possible simplement ?

    Hervé
    (ou au pire remplacez complétement tout contenu des widget du tableau de bord par mon contenu ou je mettrai des liens)

  14. Olivier dit :

    Bonjour Hervé,

    Je pense que c’est possible! Il faudrait que tu essayes de faire des tests avec les fonctions d’ajout de menus.

    Sinon, tu peux aussi virer tous les widgets et en ajouter un que tu remplis avec tes liens.

    Olivier

  15. Hervé dit :

    Bonjour Olivier,

    Pour être plus précis, je peux reprendre ton tuto sans forcément créer un plugin ?

    J’ai bien pensé virer tous les widgets (vu tuto sur le web). Le pb c’est que souvent des plugins rajoutent leur infos et je ne voudrai pas replonger dans le code à chaque fois pour les enlever 🙁
    a+

  16. Olivier dit :

    Bonjour Hervé,

    Oui si tu veux pas créer un plugin, tu peux mettre le code dans le fichier functions.php de ton theme, ça donnera le même résultat qu’avoir un plugin actif.

    Je pense que tu peux virer tous les widgets, y compris ceux ajoutés par d’autres plugins en parcourant simplement le tableau des widgets avant leur affichage et en virant tous les widgets un par un sans forcément le faire via leur nom mais plus via un parcours de tableau par index.

  17. Hervé dit :

    Bonjour,
    Ok merci pour ces pistes, je bosse dessus
    a+

  18. Florian dit :

    Bonjour Olivier,

    Je suis en train de suivre ton tuto afin de créer un plugin et je te remercie déjà de ce que tu as fait, ça m’aide beaucoup. Cependant, arrivé à cette étape, en mettant le code que tu as mis en exemple, lorsque j’active mon plugin, j’ai une erreur au niveau du fichier plugin.php (dans wp-include) : Warning: call_user_func_array() expects parameter 1 to be a valid callback, function ‘init_plugin’ not found or invalid function name in D:\wamp\www\wp2\wordpress\wp-includes\plugin.php on line 405
    Call Stack

    Je suis allé voir dans ce fichier à la ligne 405 et en gros, ce serait le parametre $the_[‘function’] de la fonction call_user_func_array() qui merde .. tu as déjà eu ça ?

    D’avance merci,

    Florian

  19. Olivier dit :

    La fonction init_plugin n’est pas trouvée… Elle ne doit pas exister. Je ne sais pas si c’est une fonction à toi ou à WP que tu appelles… Essaye de regarder qu’elle est bien accessible et qu’elle s’écrit bien comme ça.

  20. philippe dit :

    Bonsoir,
    j’ai lu attentivement votre billet, car nous essayons de trouver la solution à notre problème qui est le suivant: Nous n’avons plus dans le dashboard, les onglets extensions,apparence réglages et plus d’acces aux widgets. On ne sait pas si si c’est une question d’autorisation, de bug sur les plugins, on a testé plein de choses,chgt de base… si on fait un wp debug ‘true plein de problèmes s’affichent ovh a essayé de nous « aider » mais rien depuis 1 semaine. Avez vous une solution , svp ? Alors peut être celle exposée ici cela peut il marcher? Est ce que votre solution répond au problème , court-circuiter les autorisations et installer les onglets manquants (version wdp 3.3.1) ? si oui Pourriez vous svp nous indiquer à votre avis comment écrire le script pour apparences ou ce qu’il faut pour commencer et surtout dans quel fichier et a quelle hauteur de ligne, nous vous en remercions par avance
    Philippe

  21. Olivier dit :

    Bonjour,

    La première chose à faire est de désactiver tous les plugins pour faire réapparaître le menu complètement puis les réactiver un par un pour voir quel est celui qui fout le bordel.

    Bonne chance!

    Olivier

  22. Jean-Marc dit :

    La syntaxe des fonctions « add_menu_page » et « add_submenu_page », a du changer :

    Le niveau d’accès n’est plus un entier, mais une chaine de caractères (Le plus souvent, il faut mettre ‘manage_options’.)

    Le paramètre suivant une chaine de caractères qui sert de référence au menu, donc autant ne pas mettre __FILE__, mais choisir un nom (par exemple « my_menu_ref »)

    https://developer.wordpress.org/reference/functions/add_menu_page/

  23. Olivier dit :

    En effet, l’article date d’il y a plus de 10 ans, à une époque où WordPress n’était pas encore ce qu’il est aujourd’hui 🙂
    Depuis les appels de fonctions ont beaucoup évolué. Je n’ai plus le temps de mettre à jour ce guide mais il reste là car certaines informations sont toujours pertinentes et utiles pour ceux qui débutent dans le développement sur WordPress.



L'autre monde | Thème liquide par Olivier