Formation PUB020 : WordPress, 2023 Ajouter des options de menu dans le tableau de bord WordPress

36.1 Ajouter nos propres options dans le tableau de bord (add_menu_page())


Lorsqu'un thème ou une extension utilise des tables personnalisées ou encore des options personnalisées (informations stockées dans la table wp_options), il y a fort à parier qu'une interface de gestion sera nécessaire pour gérer les données de ces tables. Une telle interface fera partie du tableau de bord.

Le code nécessaire sera entré :

  • pour un thème : dans functions.php ou, si vous préférez découper functions.php en sous-fichiers, dans les sous-fichiers tableau-de-bord-pages.php et tableau-de-bord-menus.php
  • pour une extension : dans la classe de l'extension

▼Publicité Le texte se poursuit plus bas

Ajouter une option dans le menu du tableau de bord

Le hook admin_menu permet de personnaliser le menu du tableau de bord WordPress. Dans la fonction associée à ce hook, vous pouvez ajouter une option de menu à l'aide des fonctions WordPress suivantes :

  • add_menu_page() : ajouter une option dans le menu principal.
  • add_submenu_page() : ajouter une option qui sera placée sous une option de menu existante. Par exemple, nous pourrions créer une option de menu avec add_menu_page() puis ajouter des sous-options à ce menu à l'aide de add_submenu_page().
  • add_options_page() : ajouter une option de menu sous le menu « Paramètres » (en anglais : Settings).
  • add_management_page() : ajouter une option de menu sous le menu « Outils » (en anglais : Tools).
  • etc.

Attention : si vous tentez d'appeler ces fonctions en dehors du hook admin_menu, vous obtiendrez un message d'erreur.

Voici un extrait de code qui permet d'ajouter une option de menu principal (le menu « Mon thème » dans l'image présentée).

Ajout d'une option dans le menu principal

Fichier functions.php ou son sous-fichier tableau-de-bord-pages.php

/**
 * Crée la page de gestion du thème dans le tableau de bord.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * Utilisation : add_menu_page(..., ..., ..., ..., "monprefixe_creer_page_gestion");
 */
function monprefixe_creer_page_gestion() {
    global $title;   // titre de la page du menu, tel qu'initialisé dans la fonction de rappel de add_menu_page 
    ?>
    <div class="wrap">
        <h1 class="wp-heading-inline"><?php echo $title; ?></h1>
        ...

        <hr class="wp-header-end">
        ...
    </div>
    <?php
}

Fichier functions.php ou son sous-fichier tableau-de-bord-menus.php

/**
 * Ajoute l'option principale du menu pour gérer le thème dans le tableau de bord.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * Utilisation : add_action( "admin_menu", "monprefixe_ajouter_menu_tableau_de_bord" );
 */
function monprefixe_ajouter_menu_tableau_de_bord() {
    add_menu_page( 
        __( "Mon thème - Gestion", "mon-domaine-de-localisation" ), // texte de la balise <title>, initialisera $title
        __( "Mon thème", "mon-domaine-de-localisation" ),  // titre de l'option de menu
        "manage_options", // droits requis pour voir l'option de menu
        "monprefixe_gestion", // slug. L'URL de la page sera sous la forme mondomaine.com/wp-admin/admin.php?page=monprefixe_gestion
        "monprefixe_creer_page_gestion" // fonction de rappel pour créer la page
    );
}
 
add_action( "admin_menu", "monprefixe_ajouter_menu_tableau_de_bord" );

  • Le premier paramètre de add_menu_page() permet de spécifier le texte de la balise <title> (titre d'entête) de la page de gestion (dans l'exemple : Mon thème - Gestion). Le titre d'entête apparaît dans la barre de titre du navigateur et non dans la page elle-même. Une variable nommée $title contiendra ce titre et permettra, si nous le désirons, de l'afficher en haut de notre page (titre de contenu).
  • Le second paramètre est le titre de l'option de menu, tel qu'il apparaîtra dans la zone gauche du tableau de bord.
  • Lorsqu'on ajoute une option de menu dans le tableau de bord, il faut spécifier quels droits (WordPress appelle ça des capacités ou, en anglais, des capabilities) sont nécessaires pour pouvoir accéder à cette page (dans l'exemple : manage_options). Le code qui affiche la page devra lui aussi vérifier si l'usager dispose de cette capacité avant d'afficher la page. Attention : vous devez spécifier une capacité et non un rôle. Consultez la liste des capacités existantes pour connaître toutes les possibilités. Notez cependant que si votre option de menu doit permettre la gestion d'options, il faudra avoir minimalement la capacité manage_options pour y parvenir.
  • L'identifiant (slug) du menu (dans l'exemple : monprefixe_gestion) sera utilisé dans l'URL de la page donc visible pour les administrateurs (ex : http://mondomaine.com/wp-admin/admin.php?page=monprefixe_gestion). Il doit utiliser un préfixe afin d'éviter tout conflit avec des pages ajoutées dans le tableau de bord par le thème parent ou les extensions utilisées.
  • Le dernier paramètre est le nom de la fonction de rappel qui se chargera d'afficher le contenu dans la page du tableau de bord qui sera lancée par notre nouvelle option de menu. Cette page contiendra vraisemblablement un formulaire permettant d'afficher et/ou de gérer les données personnalisées. Il peut s'agir d'un formulaire monté de toutes pièces pour interagir avec nos tables personnalisées. Ça peut également être un formulaire géré par le « WordPress Settings API » pour gérer les options du thème ou de l'extension.

Dans la page de l'option de menu, notez la présence de la division dont la classe est "wrap". Cette division est utilisée pour formater les autres pages du tableau de bord alors nous l'utiliserons également afin que l'apparence de notre page soit conforme au reste du tableau de bord.

Attention : si vous travaillez dans la classe d'une extension, la fonction de rappel sera en fait un array() puisqu'il s'agit d'une méthode qui sera appliquée à l'objet $this.

Fchier de l'extension (PHP)

class Monprefixe_Mon_Extension {
    ...
 
    /**
     * Constructeur.
     *
     * @return void
     */
    public function __construct() {
        ...
 
        add_action( 'admin_menu', array( $this, 'ajouter_menu_tableau_de_bord' ) );
    }
 
    /**
     * Fonction de rappel pour ajouter des options de menu dans le tableau de bord.
     *
     * @return void
     */
    public function ajouter_menu_tableau_de_bord() {
        ...
 
        add_menu_page( 
            __( "Mon extension - Gestion", "mon-domaine-de-localisation" ), // texte de la balise <title>, initialisera $title
            __( "Mon extension", "mon-domaine-de-localisation" ),  // titre de l'option de menu
            "manage_options", // droits requis pour voir l'option de menu
            "monprefixe_gestion", // slug
            array( $this, "creer_page_gestion" )  // fonction de rappel pour créer la page
        );
    }
}

Icône et position

Il aurait été possible d'ajouter deux paramètres supplémentaires : l'URL de l'icône devant représenter le menu ainsi que la position du nouveau menu. Si ces paramètres sont omis, le menu utilisera l'icône par défaut et sera placé dans le bas complètement du menu WordPress.

Ajouter un sous-menu à l'aide de add_submenu_page()

Si vous souhaitez ajouter une option placée sous un menu existant, vous utiliserez add_submenu_page. Les paramètres sont très semblables à ceux de add_menu_page. Cependant, vous devrez ajouter un paramètre au tout début de la liste : le « slug » du menu parent.

Fichier functions.php ou son sous-fichier tableau-de-bord-menus.php

add_submenu_page( 
    "monprefixe_gestion",  // slug du menu parent
    __( "Mon thème - Ajouter un ...", "mon-domaine-de-localisation" ),  // texte de la balise <title>, initialisera $title
    __( "Ajouter un ...", "mon-domaine-de-localisation" ),  // titre de l'option de sous-menu
    "manage_options",  // droits requis pour voir l'option de menu
    "monprefixe_ajout", // slug
    "monprefixe_creer_page_ajout"  // fonction de rappel pour créer la page
);

Attention : si vous désirez ajouter un menu qui contiendra des sous-menu, il est d'usage de faire en sorte que pour le premier sous-menu, la fonction add_submenu_page() utilise le même identifiant (slug) comme premier paramètre (parent_slug) et comme 5e paramètre (menu_slug). Seul le titre de l'option de menu différera afin de ne pas laisser croire qu'il s'agit d'un mauvais fonctionnement.

Autrement dit, le add_menu_page() et le premier add_submenu_page() définieront tous deux la même option de menu. De cette façon, un clic sur l'option du menu principal affichera la même page que lors d'un clic sur le premier sous-menu.

Vous pouvez observer ce comportement dans les options de menu présentes par défaut dans le tableau de bord. Sous l'option de menu Nouvelles, on retrouve le sous-menu « Toutes les nouvelles ». Ces deux options de menu mènent vers la même page.

Voici donc le code permettant d'ajouter les sous-menus Gestion et Ajouter un ... sous l'option de menu Mon thème.

Fichier functions.php ou son sous-fichier tableau-de-bord-menus.php

/**
 * Ajoute l'option de menu principale et les sous-options pour gérer le thème dans le tableau de bord.
 * @author Christiane Lagacé <christiane.lagace@hotmail.com>
 *
 * Utilisation : add_action( "admin_menu", "monprefixe_ajouter_menu_tableau_de_bord" );
 */
function monprefixe_ajouter_menu_tableau_de_bord() {
    add_menu_page( 
        __( "Mon thème - Gestion", "mon-domaine-de-localisation" ),  // texte de la balise <title>, initialisera $title
        __( "Mon thème", "mon-domaine-de-localisation" ),   // titre de l'option de menu
        "manage_options", // droits requis pour voir l'option de menu
        "monprefixe_gestion", // slug
        "monprefixe_creer_page_gestion" // fonction de rappel pour créer la page
    );
 
    // première option du sous-menu : redéfinit les mêmes critères que le menu
    add_submenu_page(
        "monprefixe_gestion",  // slug du menu parent
        __( "Mon thème - Gestion", "mon-domaine-de-localisation" ),  // texte de la balise <title> - même que dans add_menu_page()
        __( "Gestion", "mon-domaine-de-localisation" ),   // titre de l'option de sous-menu
        "manage_options",  // droits requis pour voir l'option de menu
        "monprefixe_gestion", // réutiliser le slug du menu parent
        "monprefixe_creer_page_gestion"  // fonction de rappel pour créer la page - même que dans add_menu_page()
    );
 
    // seconde option du sous-menu
    add_submenu_page( 
        "monprefixe_gestion",   // slug du menu parent
        __( "Mon thème - Ajouter un ...", "mon-domaine-de-localisation" ),  // texte de la balise <title>, initialisera $title
        __( "Ajouter un ...", "mon-domaine-de-localisation" ),   // titre de l'option de sous-menu
        "manage_options",  // droits requis pour voir l'option de menu
        "monprefixe_ajout", // slug
        "monprefixe_creer_page_ajout"  // fonction de rappel pour créer la page
    );
}
 
add_action( "admin_menu", "monprefixe_ajouter_menu_tableau_de_bord" );

Et voici le résultat obtenu par ce code :

Menu personnalisé avec sous-menus

Pour plus d'information

« Administration Menus ». Codex WordPress. http://codex.wordpress.org/Administration_Menus

« Create a Simple WordPress Admin Panel – Part ICreate a Simple WordPress Admin Panel – Part I ». Colorlabs. http://colorlabsproject.com/tutorials/create-a-simple-wordpress-admin-panel/

« Plugin API/Action Reference/admin menu ». Codex WordPress. http://codex.wordpress.org/Plugin_API/Action_Reference/admin_menu

« Function Reference/add menu page ». Codex WordPress. http://codex.wordpress.org/Function_Reference/add_menu_page

« Ultimate guide to roles and capabilities ». Solis Lab. http://solislab.com/blog/ultimate-guide-to-roles-and-capabilities/

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 26 janvier 2024
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre