Contenu principal

Menu administration WordPress : placer les extensions tout en bas

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!