Aquí hay un tutorial rápido de cómo se construye el menú de administración de WordPress: no estoy hablando de la add_menu_page
API, me refiero al menú predeterminado de WordPress.
Llamar al archivo de menú
El menú es, obviamente, cargado por wp-admin/admin.php
. Pero no se carga a través de la API estándar que estamos acostumbrados a usar según la documentación de WordPress. Por el contrario, todo el menú (todas las opciones posibles, submenús, etc.) se cargan 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
solo require
s menu.php
... alrededor de la línea 99 en WordPress 3.0.
Cargando el menú
El menú en sí se almacena en la matriz global $menu
. De acuerdo con 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 tablero, por ejemplo, es:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
El archivo pasa y carga cada elemento de menú en la matriz y carga todos sus elementos de submenú en una matriz llamada $submenu
índices basados en la url del menú principal. Entonces, el elemento del submenú del Tablero llamado "Tablero" es:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
Después de que el sistema haya terminado de cargar todos los menús (no hay tantos, pero el sistema pasa por el índice en 5 o 10 a la vez ... observe que el Tablero, aunque es el primer elemento del menú, todavía está indexado como elemento "2" (las matrices PHP comienzan en el índice 0 ... así que esto le da un poco de margen de maniobra).
En este punto, el sistema llama 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 recorre las páginas principales y hace lo mismo. Luego, elimina los separadores duplicados que quedan de haber eliminado los menús.
Finalmente, ordena los menús según su orden de menú asignado.
Ordenar menús personalizados
Se admin_menu
llama al gancho después de configurar los menús, pero antes de ordenar algo. Por lo tanto, es posible ordenar todo el sistema de menús de WordPress sin "hackear" la API.
Una vez que se activa la acción admin_menu
, sus páginas personalizadas se cargan en el sistema. Lo siguiente que sucede es que WordPress comprueba un filtro llamado custom_menu_order
... este filtro siempre se devuelve false
y le dice a WordPress si desea o no usar un pedido personalizado.
Agregue lo siguiente a su tema para establecer la bandera en su true
lugar y defina su orden explícito de menú:
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 del menú para que pueda obtener una lista de nombres de archivos) y esto debería encargarse de ello.
EDITAR (2/9/2010):
Para especificar el orden de la pantalla de edición de un tipo de publicación personalizado utilizando este método, debe conocer la URL de la pantalla de edición. En la mayoría de los casos, lo 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 el slug del tipo de publicación personalizada que está utilizando.
Por ejemplo...
Supongamos que tiene un tipo de publicación personalizado para 'Preguntas de intercambio de pila' y desea que el editor aparezca en la misma sección que el tablero directamente debajo del icono del tablero. Usaría el siguiente código en el functions.php
archivo 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 tablero y aparecerá inmediatamente debajo de ella. 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.