Un client qui gère une boutique WooCommerce et un blog d’accompagnement nous a fait une remarque révélatrice : « Pourquoi « Commentaires » apparaît avant « Commandes » dans mon menu ? Je ne modère jamais de commentaires, mais je regarde mes commandes tous les jours. » Le menu d’administration par défaut de WordPress suit un ordre historique, pensé pour un blog classique, qui ne correspond que rarement à l’usage réel d’un site e-commerce ou vitrine moderne.
Réorganiser ce menu selon les priorités réelles d’un client demande deux ingrédients : le filtre custom_menu_order couplé à menu_order, qui contrôle l’ordre d’affichage, et le filtre $menu lui-même pour ajuster les libellés.
Activer la réorganisation personnalisée
Le filtre custom_menu_order doit renvoyer true pour que WordPress accepte de prendre en compte un ordre personnalisé fourni ensuite via menu_order :
add_filter( 'custom_menu_order', '__return_true' );
function bc_ordre_menu_personnalise( $menu_ordre ) {
return array(
'index.php', // Tableau de bord
'edit.php?post_type=shop_order', // Commandes WooCommerce
'edit.php?post_type=product', // Produits
'edit.php', // Articles
'upload.php', // Médiathèque
'edit-comments.php', // Commentaires, relégués en bas
'themes.php',
'plugins.php',
'users.php',
'tools.php',
'options-general.php',
);
}
add_filter( 'menu_order', 'bc_ordre_menu_personnalise' );
Chaque entrée correspond au slug exact du menu principal tel qu’enregistré par WordPress ou par l’extension concernée. Un tableau incomplet fonctionne sans erreur : les entrées non mentionnées sont simplement affichées à la suite, dans leur ordre d’origine.

Renommer les libellés existants
Le renommage passe par une manipulation directe de la variable globale $menu, accrochée sur admin_menu avec une priorité tardive pour s’assurer que tous les menus, y compris ceux ajoutés par des extensions, sont déjà enregistrés :
function bc_renommer_libelles_menu() {
global $menu;
foreach ( $menu as $cle => $item ) {
if ( isset( $item[2] ) && 'edit-comments.php' === $item[2] ) {
$menu[ $cle ][0] = 'Avis clients';
}
if ( isset( $item[2] ) && 'edit.php?post_type=shop_order' === $item[2] ) {
$menu[ $cle ][0] = 'Commandes du jour';
}
}
}
add_action( 'admin_menu', 'bc_renommer_libelles_menu', 999 );
La structure de chaque entrée de $menu suit un format fixe : libellé, capacité requise, slug, titre de page, classes CSS, identifiant HTML, et icône. Seul l’indice 0 nous intéresse ici pour le renommage du libellé visible.
Construire le tableau de priorités avec le client
Avant d’écrire la moindre ligne de code, il vaut mieux passer dix minutes avec le client à lister, dans l’ordre, les trois ou quatre écrans qu’il consulte réellement au quotidien. Ce tableau de priorités, une fois validé, se transpose directement dans le tableau PHP de menu_order :
| Priorité client | Menu concerné | Slug technique |
|---|---|---|
| 1 | Commandes | edit.php?post_type=shop_order |
| 2 | Produits | edit.php?post_type=product |
| 3 | Articles du blog | edit.php |
| 4 | Avis clients (commentaires) | edit-comments.php |
Attention aux sous-menus
menu_order ne réorganise que le menu de premier niveau. Les sous-menus conservent leur ordre d’origine à l’intérieur de chaque entrée principale. Pour les réordonner également, il faut manipuler la variable globale $submenu selon le même principe, ce qui alourdit rapidement le code pour un gain souvent marginal : mieux vaut réserver cet effort aux cas où un sous-menu précis pose vraiment problème au quotidien.
Un menu réorganisé pour un client précis reste fragile face aux mises à jour d’extensions qui ajoutent de nouvelles entrées : une vérification rapide après chaque montée de version majeure évite les mauvaises surprises.
En résumé
Combiner custom_menu_order, menu_order et un filtre sur $menu permet de faire correspondre l’administration WordPress à l’usage réel d’un client, sans toucher au menu_order du contenu lui-même, qui répond à une logique tout à fait différente et déjà traitée séparément sur ce blog.