Vous avez des extensions qui s’incrustent où bon leur semblent dans votre menu d’administration ? Ça vous énerve ? Moi aussi. Et si on remettait ce petit monde en bas du menu, à sa place ?
Bon, on fait comment ?
Déjà, on va placer un hook sur 'admin_menu'
, c’est le meilleur endroit pour modifier le menu.
Ensuite, il y a la variable globale $menu
qui nous intéresse car elle contient… les élément du menu (surprise !). Dans cette variable (un tableau), voici à quoi ressemble un élément de menu :
Array
(
[0] => Tableau de bord
[1] => read
[2] => index.php
[3] =>
[4] => menu-top menu-top-first menu-icon-dashboard
[5] => menu-dashboard
[6] => none
)
L’info qui va nous intéresser est l’index 2 (index.php
). Pourquoi ? Parce que l’on peut facilement prévoir les valeurs de cette donnée. Ha ? Oui, on connait les valeurs par défaut, ce sont en quelque sorte les url des pages de l’administration, on s’en sert par exemple dans la fonction add_menu_page()
(hasard ? Je ne crois pas). On a aussi deux cas particuliers : le premier c’est pour les pages de post type « non article », donc les pages ou les CPTs où on aura par exemple edit.php?post_type=page
. Le second cas particulier ce sont les séparateurs.
Bref, passons à la pratique. À mettre dans le fichier functions.php
de votre thème :
0102030405060708091011121314151617
add_action('admin_menu', 'tout_le_monde_descend', 11);
function tout_le_monde_descend() {
global $menu;
$items = array();
$core = array( 'index.php', 'edit.php', 'upload.php', 'link-manager.php', 'edit-comments.php', 'themes.php', 'plugins.php', 'users.php', 'tools.php', 'options-general.php' );
if ( count($menu) ) {
foreach ( $menu as $k => $menu_item ) {
if ( in_array($menu_item[2], $core) || strpos($menu_item[2], $core[1]) === 0 || $menu_item[4] == 'wp-menu-separator' )
continue;
$items[] = $menu_item;
unset($menu[$k]);
}
}
// La suite...
}
En résumé, avec in_array($menu_item[2], $core)
on vérifie s’il s’agit d’une page de WordPress qui existe par défaut. Avec strpos($menu_item[2], $core[1]) === 0
on vérifie s’il s’agit d’une page du type edit.php?post_type=page
(notez bien l’emploi de === 0
car strpos()
retourne false
si la chaine n’est pas trouvée). Et pour finir, avec $menu_item[4] == 'wp-menu-separator'
on vérifie s’il s’agit d’un séparateur.
Bref, si aucune de ces 3 conditions n’est remplie, cela signifie que c’est une page de plugin, et donc il nous faudra déplacer cet élément. Pour cela, on range ces éléments dans un tableau séparé et on supprime l’élément du menu.
Seconde étape, ajouter les éléments trouvés à la fin du menu. En fait, on aurait pu faire ça directement dans la première boucle que nous avons faite, mais il faut ajouter un petit quelque chose avant : un séparateur. Si vous n’avez qu’un seul plugin qui ajoute son élément dans le menu, et que celui-ci doit être déplacé, cela veut dire que sous l’élément « Réglages » vous n’avez rien à l’origine, donc dans ce cas il faut ajouter un séparateur car il n’aura pas été ajouté automatiquement. Donc, avant d’ajouter les éléments, on doit vérifier la présence d’un séparateur à la fin du menu, et s’il n’y en a pas, on en ajoute un.
Allez, le code au complet :
01020304050607080910111213141516171819202122232425
add_action('admin_menu', 'tout_le_monde_descend', 11);
function tout_le_monde_descend() {
global $menu;
$items = array();
$core = array( 'index.php', 'edit.php', 'upload.php', 'link-manager.php', 'edit-comments.php', 'themes.php', 'plugins.php', 'users.php', 'tools.php', 'options-general.php' );
if ( count($menu) ) {
foreach ( $menu as $k => $menu_item ) {
if ( in_array($menu_item[2], $core) || strpos($menu_item[2], $core[1]) === 0 || $menu_item[4] == 'wp-menu-separator' )
continue;
$items[] = $menu_item;
unset($menu[$k]);
}
}
if ( count($items) ) {
$last = end($menu);
if ( !isset($last[4]) || $last[4] != 'wp-menu-separator' )
$menu[] = array( '', 'read', 'separator-last', '', 'wp-menu-separator' );
foreach ( $items as $item ) {
$menu[] = $item;
}
}
}
Et voilà, « Une place pour chaque chose et chaque chose à sa place » comme on dit ^^
See ya!
Commentaires
Commentaire de TweetPress de France @ TweetPress.fr.
« …et place nette » ^^
Intéressante cette vérification de page en plus.
Commentaire de Prestaref.com.
Vraiment cool cette astuce. J’en avais un peu marre de me perdre dans les menus de mes différents WP. Maintenant tout est clair.
Commentaire de Julio Potier @ BoiteAWeb.
Hello
Autant j’avais pensé à mettre tout ce qui n’est pas WP dans un nouveau menu parent « Plugins » et ainsi éviter de remplir/noyer le menu « Réglages », autant déplacer les menus parents en bas ne m’avait pas traversé l’esprit.
J’ai testé (comme d’hab) ton code et je garde ça dans mes muplugins à installer partout, c’est tellement plus logique aussi. Le client a les menus WP en haut, même les CPTs restent, et en bas, les ajouts.
Un ptit hook en plus pour laisser passer un plugin qu’on souhaite laisser en haut et tout est bon !
Encore un Merci pour Greg :)
Commentaire de Grégory Viguier.
Pourquoi pas, un filtre sur
$core
pourrait être utile.