Ecco una breve panoramica di come è costruito il menu di amministrazione di WordPress: non sto parlando add_menu_page
dell'API, intendo l'attuale menu di WordPress predefinito.
Richiamo del file di menu
Il menu è, ovviamente, caricato da wp-admin/admin.php
. Ma non è caricato tramite l'API standard a cui siamo abituati in base alla documentazione di WordPress. Piuttosto, l'intero menu (tutte le possibili opzioni, sottomenu, ecc.) Viene caricato tramite un semplice array definito in wp-admin/menu.php
.
Quindi, per caricare il sistema di menu, admin.php
basta require
s menu.php
... intorno alla linea 99 in WordPress 3.0.
Caricamento del menu
Il menu stesso è memorizzato nell'array globale $menu
. Secondo la documentazione in linea, l'array di menu ha questi elementi:
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
La dashboard, ad esempio, è:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
Il file attraversa e carica ciascuna voce di menu nell'array e carica tutte le voci del sottomenu in un array chiamato $submenu
indicizzato in base all'URL del menu principale. Quindi l'elemento del sottomenu del Dashboard chiamato "Dashboard" è:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
Dopo che il sistema ha terminato il caricamento di tutti i menu (non ce ne sono molti, ma il sistema attraversa l'indice alla volta di 5 o 10 ... notare che il Dashboard, anche se è la prima voce di menu, è ancora indicizzato come elemento "2" (le matrici PHP iniziano con l'indice 0 ... quindi questo ti dà un po 'di spazio di manovra).
A questo punto, il sistema chiama wp-admin/includes/menu.php
.
Scorrere il menu
Questo terzo file attraversa ciascuna voce di menu e, in base ai privilegi assegnati all'utente corrente, utilizza il menu o lo rimuove. Innanzitutto scorre in tutti i sottomenu e rimuove le pagine a cui l'utente non può accedere. Quindi scorre le pagine padre e fa la stessa cosa. Quindi rimuove tutti i separatori duplicati che rimangono dall'eliminazione dei menu.
Infine, ordina i menu in base all'ordine di menu assegnato.
Ordinazione di menu personalizzati
L'hook admin_menu
viene chiamato dopo aver impostato i menu ma prima di ordinare qualsiasi cosa. Quindi è possibile ordinare l'intero sistema di menu WordPress senza "hackerare" l'API.
Dopo l'attivazione dell'azione admin_menu
, le pagine personalizzate vengono caricate nel sistema. La prossima cosa che succede è che WordPress controlla un filtro chiamato custom_menu_order
... questo filtro viene sempre restituitofalse
e dice a WordPress se si desidera o meno utilizzare un ordine personalizzato.
Aggiungi quanto segue al tema per impostare invece il flag true
e definire il tuo ordine di menu esplicito:
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');
Specifica l'ordine desiderato per tutti i menu (ho fornito riferimenti al file di caricamento dei menu in modo da poter ottenere un elenco di nomi di file) e questo dovrebbe occuparsene.
MODIFICA (9/2/2010):
Per specificare l'ordine della schermata di modifica di un tipo di post personalizzato utilizzando questo metodo, è necessario conoscere l'URL della schermata di modifica. Nella maggior parte dei casi, lo sarà http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. Questo dipende da come WordPress è impostato sul tuo sito (se è installato nella radice o in una sottocartella) e dalla lumaca del tipo di post personalizzato che stai utilizzando.
Per esempio...
Supponiamo che tu abbia un tipo di post personalizzato per "Stack Exchange Questions" e desideri che l'editor appaia nella stessa sezione del dashboard direttamente sotto l'icona del dashboard. Utilizzeresti il seguente codice nel functions.php
file del tuo 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');
Il resto del menu non sarà interessato, ma la pagina di modifica personalizzata verrà spostata nella stessa sezione della dashboard e verrà visualizzata immediatamente sotto di essa. Puoi utilizzarlo per spostare i tuoi tipi di post personalizzati in qualsiasi sezione del menu di amministrazione e posizionarli in qualsiasi ordine. Puoi anche spostare le voci di menu standard allo stesso modo.
Assicurati solo di specificare l'ordine di tutte le voci di menu nella sezione data , altrimenti il tuo menu potrebbe essere soggetto a qualche stranezza inaspettata.