Este es un breve recorrido de cómo se crea el menú de administración de WordPress: no estoy hablando del add_menu_page
API, me refiero al menú de WordPress predeterminado real.
Llamando el archivo de menú
El menú está, obviamente, cargado por wp-admin/admin.php
. Pero no se carga a través de la API estándar que estamos acostumbrados a utilizar según la documentación de WordPress. Más bien, todo el menú (todas las opciones posibles, submenús, etc.) se carga a través de una matriz simple que se define en wp-admin/menu.php
.
Entonces, para cargar el sistema de menús, admin.php
just require
s menu.php
... alrededor de la línea 99 en WordPress 3.0.
Cargando el menú
El menú en sí está almacenado en la matriz global $menu
. Según la documentación en línea, la matriz del menú tiene estos elementos:
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
El panel de control, por ejemplo, es:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
El archivo avanza y carga cada elemento del menú en la matriz y carga todos sus elementos del submenú en una matriz llamada $submenu
que se indexa según la URL del menú principal. Por lo tanto, el elemento del submenú del Panel de control llamado "Panel de control" es:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
Una vez que el sistema haya terminado de cargar todos los menús (no hay muchos, pero el sistema avanza el índice a la vez en 5 o 10 ... observe que el Tablero de instrumentos, aunque es el primer elemento del menú, es aún indexado como elemento "2" (las matrices de PHP comienzan en el índice 0 ... así que esto le da un poco de espacio de maniobra).
En este punto, el sistema llama a wp-admin/includes/menu.php
.
Pasando por el menú
Este tercer archivo recorre cada elemento del menú y, según los privilegios asignados al usuario actual, utiliza el menú o lo elimina. Primero recorre todos los submenús y elimina las páginas a las que el usuario no puede acceder. Luego pasa por las páginas principales y hace lo mismo. Luego elimina cualquier separador duplicado que quede de haber eliminado los menús.
Finalmente, ordena los menús según su orden de menú asignado.
Ordenar menús personalizados
Se llama al gancho admin_menu
después de configurar los menús pero antes se ordena cualquier cosa. Por lo tanto, es posible ordenar todo el sistema de menús de WordPress sin "piratear" la API.
Después de que se haya activado la acción admin_menu
, sus páginas personalizadas se cargan en el sistema. Lo siguiente que sucede es que WordPress verifica un filtro llamado custom_menu_order
... este filtro siempre se devuelve false
y le dice a WordPress si desea usar un orden personalizado o no.
En su lugar, agregue lo siguiente a su tema para establecer el indicador en true
y defina su orden de menú explícito:
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');
Especifique el orden que desea para todos los menús (proporcioné referencias al archivo de carga de menú para que pueda obtener una lista de nombres de archivos) y esto debería hacerse cargo de ello.
EDITAR (9/2/2010):
Para especificar el orden de la pantalla de edición de un tipo de publicación personalizada mediante este método, debe conocer la URL de la pantalla de edición. En la mayoría de los casos, será http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. Esto depende de cómo se configura WordPress en su sitio (si está instalado en la raíz o en una subcarpeta) y la barra del tipo de publicación personalizada que esté usando.
Por ejemplo ...
Supongamos que tiene un tipo de publicación personalizada para "Preguntas de intercambio de pila" y desea que el editor aparezca en la misma sección que el panel de control, justo debajo del icono del panel de control. Usaría el siguiente código en el archivo functions.php
de su tema:
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');
El resto del menú no se verá afectado, pero su página de edición personalizada se moverá a la misma sección que el panel y aparecerá inmediatamente debajo. Puede usar esto para mover sus tipos de publicaciones personalizadas a cualquier sección del menú de administración y colocarlas en cualquier orden. También puede mover elementos de menú estándar de la misma manera.
Solo asegúrese de especificar el orden de todos los elementos del menú en la sección dada , de lo contrario, su menú podría estar sujeto a alguna rareza inesperada.