Voici une présentation rapide de la façon dont le menu d'administration WordPress est construit - je ne parle pas de l' add_menu_page
API, je veux dire le menu WordPress par défaut réel.
Appel du fichier de menu
Le menu est, évidemment, chargé par wp-admin/admin.php
. Mais il n'est pas chargé via l'API standard que nous avons l'habitude d'utiliser sur la base de la documentation WordPress. Au contraire, l'ensemble du menu (toutes les options possibles, sous-menus, etc.) est chargé via un tableau simple défini dans wp-admin/menu.php
.
Donc, pour charger le système de menus, il admin.php
suffit de require
s menu.php
... autour de la ligne 99 dans WordPress 3.0.
Chargement du menu
Le menu lui-même est stocké dans le tableau global $menu
. Selon la documentation en ligne, le tableau de menus comprend les éléments suivants:
The elements in the array are:
* 0: Menu item name
* 1: Minimum level or capability required.
* 2: The URL of the item's file
* 3: Class
* 4: ID
* 5: Icon for top level menu
Le tableau de bord, par exemple, est:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
Le fichier parcourt et charge chaque élément de menu dans le tableau et charge tous leurs éléments de sous-menu dans un tableau appelé $submenu
index en fonction de l'URL du menu parent. Ainsi, l'élément de sous-menu du tableau de bord appelé "Dashboard" est:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
Une fois que le système a terminé de charger tous les menus (il n'y en a pas beaucoup, mais le système parcourt l'index au moment de 5 ou 10 ... notez que le tableau de bord, même s'il s'agit du premier élément de menu, est toujours indexé comme item "2" (les tableaux PHP commencent à l'index 0 ... donc cela vous donne une certaine marge de manœuvre).
À ce stade, le système appelle wp-admin/includes/menu.php
.
Parcourir le menu
Ce troisième fichier parcourt chaque élément de menu et, en fonction des privilèges attribués à l'utilisateur actuel, utilise le menu ou le supprime. Tout d'abord, il parcourt tous les sous-menus et supprime les pages auxquelles l'utilisateur ne peut pas accéder. Ensuite, il parcourt les pages parent et fait la même chose. Ensuite, il supprime tous les séparateurs en double qui restent après avoir supprimé les menus.
Enfin, il trie les menus en fonction de leur ordre de menu attribué.
Commande de menus personnalisés
Le hook admin_menu
est appelé après la configuration des menus mais avant toute commande. Il est donc possible de commander l'intégralité du système de menus WordPress sans "pirater" l'API.
Une fois l'action admin_menu
déclenchée, vos pages personnalisées sont chargées dans le système. La prochaine chose qui se passe, c'est que WordPress vérifie un filtre appelé custom_menu_order
... ce filtre est toujours renvoyé false
et indique à WordPress si vous souhaitez ou non utiliser une commande personnalisée.
Ajoutez ce qui suit à votre thème pour définir le drapeau à la true
place et définir votre ordre de menu explicite:
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array('index.php', 'edit.php', 'edit-comments.php');
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
Spécifiez l'ordre que vous souhaitez pour tous les menus (j'ai fourni des références au fichier de chargement de menu afin que vous puissiez obtenir une liste de noms de fichiers) et cela devrait s'en occuper.
EDIT (9/2/2010):
Pour spécifier l'ordre de l'écran d'édition d'un type de publication personnalisé à l'aide de cette méthode, vous devez connaître l'URL de l'écran d'édition. Dans la plupart des cas, ce sera le cas http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. Cela dépend de la configuration de WordPress sur votre site (s'il est installé à la racine ou dans un sous-dossier) et du slug du type de publication personnalisé que vous utilisez.
Par exemple...
Supposons que vous ayez un type de publication personnalisé pour «Stack Exchange Questions» et que vous souhaitiez que l'éditeur apparaisse dans la même section que le tableau de bord directement sous l'icône du tableau de bord. Vous utiliseriez le code suivant dans le functions.php
fichier de votre thème :
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
Le reste du menu ne sera pas affecté, mais votre page d'édition personnalisée sera déplacée vers la même section que le tableau de bord et apparaîtra immédiatement en dessous. Vous pouvez l'utiliser pour déplacer vos types de publication personnalisés vers n'importe quelle section du menu d'administration et les placer dans n'importe quel ordre. Vous pouvez également déplacer les éléments de menu standard de la même manière.
Assurez-vous simplement de spécifier l'ordre de tous les éléments de menu dans la section donnée , sinon votre menu pourrait être sujet à une bizarrerie inattendue.