Modificare l'Ordine delle Sezioni del Menu di Amministrazione?
Mi sto frustrando dopo aver speso diverse ore cercando di realizzare questo compito apparentemente semplice senza alcun successo.
In sostanza ho 5 custom post type che ho creato e tutto quello che voglio fare è mostrarli in un ordine specifico direttamente sotto la "dashboard".
Dalla documentazione WordPress sembra che non sia realmente possibile farlo perché l'ordine più alto del menu sembra essere "5". E sopra
Immagino che qualche esperto che sta leggendo possa mostrarmi il modo semplice con cui posso ordinare il menu di amministrazione esattamente come voglio utilizzando il file functions.php e senza utilizzare un plugin (che so che esiste).
Per favore, provate a creare 5 tipi di post separati e includeteli in un ordine specifico direttamente sotto la dashboard... sembra che questo non sia possibile.??... c'è qualche tipo di hack jQuery per far funzionare questo che qualcuno potrebbe condividere con me o preferibilmente senza utilizzare jQuery?
Ciao @BinaryBit:
Non c'è da meravigliarsi se sei un po' frustrato; il menu di amministrazione è una delle implementazioni più oscure e frustranti nel core di WordPress. Onestamente, non so a cosa stessero pensando quando l'hanno progettato in quel modo.
@EAMann ha fatto un eccellente lavoro nel spiegare come funzionano i menu di amministrazione in WordPress (avrei voluto leggerlo circa 4 mesi fa... :)
Tuttavia, dopo aver capito come funzionava, ero ancora in difficoltà nel lavorarci senza dedicare abbastanza tempo per mantenere la mente lucida mentre cercavo di fare cose semplici. Ecco perché ho costruito un'API per i Menu che semplifica e ottimizza il lavoro con il menu di amministrazione di WordPress.
Sono al 100% compatibili con le strutture esistenti di WordPress e ancora in fase alpha, visto che sono stato l'unico a usarli. Sono sicuro che ci sono casi d'uso che non gestiscono ancora. Ma posterò qui il codice per te e altri da provare.
Puoi scaricare il file da inserire nella directory del tuo tema qui: wp-admin-menu-classes.php e quanto segue mostra come potresti chiamare le funzioni nel file functions.php
del tuo tema:
<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
swap_admin_menu_sections('Pages','Posts'); // Scambia la posizione della sezione Posts con quella Pages
rename_admin_menu_section('Media','Foto & Video'); // Rinomina la sezione Media in "Foto & Video"
delete_admin_menu_section('Links'); // Elimina la sezione Links
$movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags'); // Salva l'elemento del menu Movie Tags
update_admin_menu_section('Movies',array( // Rinomina due elementi del menu Movies e elimina Movie Tags
array('rename-item','item'=>'Movies','new_title'=>'Lista Film'),
array('rename-item','item'=>'Add New','new_title'=>'Aggiungi Film'),
array('delete-item','item'=>'Movie Tags'),
));
copy_admin_menu_item('Movies',array('Actors','Add New')); // Copia 'Add New' dalla sezione Actors
renamed_admin_menu_item('Movies','Add New','Aggiungi Attore'); // Rinomina la copia di 'Add New' in 'Aggiungi Attore'
add_admin_menu_item('Movies',array( // (Un altro modo per ottenere un link 'Aggiungi Attore' in una sezione.)
'title' => 'Alt Aggiungi Attore',
'slug' => 'post-new.php?post_type=actor',
), array(// Aggiungi di nuovo Movie Tags alla fine.
'where'=>'end'
));
add_admin_menu_item('Movies',$movie_tags_item_array,array(// Aggiungi di nuovo Movie Tags alla fine.
'where'=>'end'
));
delete_admin_menu_section('Actors'); // Infine elimina la sezione Actors
}
Inoltre, queste funzioni sono addirittura in considerazione (come base) per l'inclusione in WordPress 3.1 quindi, se siamo fortunati, potrebbero persino diventare standard!

Fantastico aggiunta all'API! Mi ci sono voluti mesi per aggiungere la mia prima sezione di menu personalizzata con il framework esistente (ed è per questo che ho studiato così tanto il codice)... ma la tua API sembra molto più intuitiva da usare!

@EAMann - Grazie! Se vuoi offrire qualche suggerimento o anche collaborare per migliorarla, mi piacerebbe creare qualcosa che possa rendere tutto più semplice per tutti, non solo per i pochi che capitano su questo Q&A.

questa funzionalità è stata integrata nel core o è ancora necessario usare questo o qualcosa di simile per manipolare l'ordine delle voci di menu nell'admin?

Ciao Mike - wp_debug genera un errore su questa funzione: -------- function swap_admin_menu_sections($from_section,$to_section) { $from_section = get_admin_menu_section($from_section); if ($from_section) $from_section->swap_with($to_section); return $section; }
Notice: Undefined variable: section

Ecco una rapida panoramica su come viene costruito il menu di amministrazione di WordPress - non mi riferisco all'API add_menu_page
, ma al menu predefinito di WordPress.
Chiamata del File del Menu
Il menu viene, ovviamente, caricato da wp-admin/admin.php
. Ma non viene caricato tramite l'API standard che conosciamo dalla documentazione di WordPress. Piuttosto, l'intero menu (tutte le opzioni possibili, sottomenu, ecc.) viene caricato tramite un semplice array definito in wp-admin/menu.php
.
Quindi per caricare il sistema del menu, admin.php
semplicemente require
il file menu.php
... circa alla riga 99 in WordPress 3.0.
Caricamento del Menu
Il menu stesso è memorizzato nell'array globale $menu
. Secondo la documentazione in linea, l'array del menu ha questi elementi:
Gli elementi nell'array sono:
* 0: Nome della voce del menu
* 1: Livello minimo o capacità richiesta.
* 2: L'URL del file della voce
* 3: Classe
* 4: ID
* 5: Icona per il menu di primo livello
La dashboard, ad esempio, è:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
Il file procede a caricare ogni voce del menu nell'array e tutte le loro sottovoci in un array chiamato $submenu
che si basa sull'URL del menu genitore. Quindi la sottovoce della Dashboard chiamata "Dashboard" è:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
Dopo che il sistema ha finito di caricare tutti i menu (non ce ne sono molti, ma il sistema scorre l'indice aumentando di 5 o 10 ... notate che la Dashboard, anche se è la prima voce del menu, è comunque indicizzata come voce "2" (gli array PHP iniziano dall'indice 0 ... quindi questo vi dà un po' di spazio di manovra).
A questo punto, il sistema chiama wp-admin/includes/menu.php
.
Scorrere il Menu
Questo terzo file passa in rassegna ogni voce del menu e, in base ai privilegi assegnati all'utente corrente, la utilizza o la rimuove. Prima scorre tutti i sottomenu e rimuove le pagine a cui l'utente non può accedere. Poi scorre le pagine genitore e fa lo stesso. Infine rimuove eventuali separatori duplicati rimasti dall'eliminazione dei menu.
Alla fine, ordina i menu in base all'ordine assegnato.
Ordinamento dei menu personalizzati
L'hook admin_menu
viene chiamato dopo che i menu sono stati impostati ma prima che vengano ordinati. Quindi è possibile ordinare l'intero sistema di menu di WordPress senza "hackerare" l'API.
Dopo che l'azione admin_menu
è stata attivata, le tue pagine personalizzate vengono caricate nel sistema. La prossima cosa che accade è che WordPress controlla un filtro chiamato custom_menu_order
... questo filtro restituisce sempre false
e indica a WordPress se vuoi utilizzare un ordine personalizzato.
Aggiungi il seguente codice al tuo tema per impostare il flag su true
e definire il tuo ordine esplicito del menu:
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 che desideri per tutti i menu (ho fornito riferimenti al file di caricamento del menu in modo che tu possa ottenere un elenco dei nomi dei file) e questo dovrebbe essere sufficiente.
MODIFICA (02/09/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, sarà http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. Questo dipende da come WordPress è configurato sul tuo sito (se è installato nella radice o in una sottocartella) e dallo slug del tipo di post personalizzato che stai utilizzando.
Per esempio...
Supponiamo che tu abbia un tipo di post personalizzato per 'Domande di Stack Exchange' e vuoi che l'editor appaia nella stessa sezione della dashboard direttamente sotto l'icona della dashboard. Utilizzeresti il seguente codice nel file functions.php
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à influenzato, ma la tua pagina di modifica personalizzata verrà spostata nella stessa sezione della dashboard e apparirà immediatamente sotto di essa. Puoi utilizzare questo metodo 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 del menu standard nello stesso modo.
Assicurati solo di specificare l'ordine di tutte le voci del menu nella sezione data, altrimenti il tuo menu potrebbe essere soggetto a qualche stranezza inaspettata.

C'è un piccolo errore nel tuo codice di esempio sotto l'intestazione "Ordinamento menu personalizzati", l'istruzione condizionale if manca del simbolo $
sul nome della variabile... (Ottima risposta comunque)...

Come aggiungeresti il tipo di post personalizzato per "Stack Exchange Questions" in una sezione sotto la sezione Dashboard?

Ciao EAMann - domanda veloce. Con l'ultima versione di WordPress questo processo è cambiato o è diventato più semplice?

E per quanto riguarda i sottomenu? Esiste un metodo simile per riorganizzare gli elementi del sottomenu?

@GiraldiMaggio Per favore fai una nuova domanda e fai riferimento a questa.

Mi rendo conto che questo è un vecchio thread, ma penso valga la pena aggiornarlo con una soluzione MOLTO più semplice. Nota che questo funziona con la versione 3.5 e non è stato testato con altre versioni. Il seguente codice può essere inserito in un plugin o nel file functions.php.
Vedi: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order. Modificato leggermente per adattarsi alle esigenze dell'utente originale (anche se spero abbia già trovato una soluzione...).
// Riordina il menu di amministrazione
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array(
'index.php', // Pannello di controllo
'edit.php?post_type=custom_type_one', // Tipo personalizzato uno
'edit.php?post_type=custom_type_two', // Tipo personalizzato due
'edit.php?post_type=custom_type_three', // Tipo personalizzato tre
'edit.php?post_type=custom_type_four', // Tipo personalizzato quattro
'edit.php?post_type=custom_type_five', // Tipo personalizzato cinque
'separator1', // Primo separatore
'edit.php?post_type=page', // Pagine
'edit.php', // Articoli
'upload.php', // Media
'link-manager.php', // Collegamenti
'edit-comments.php', // Commenti
'separator2', // Secondo separatore
'themes.php', // Aspetto
'plugins.php', // Plugin
'users.php', // Utenti
'tools.php', // Strumenti
'options-general.php', // Impostazioni
'separator-last', // Ultimo separatore
);
}
add_filter('custom_menu_order', 'custom_menu_order'); // Attiva custom_menu_order
add_filter('menu_order', 'custom_menu_order');
Qualsiasi voce nel menu di amministrazione che non è elencata qui non verrà rimossa. Verrà aggiunta in fondo al menu.

Per spostare le voci del menu, mi piace usare la variabile globale $menu
.
Ad esempio, se volessi spostare il menu "Pagine" in fondo agli altri menu, userei questo codice in functions.php
o in un plugin:
function admin_menu_items() {
global $menu;
$menu[102]=$menu[20];//rende il menu 102 uguale al menu 20 (pagine)
$menu[20]=array();//fa scomparire il menu originale delle pagine
}
add_action('admin_menu', 'admin_menu_items');
E se volessi scambiare i menu Articoli e Collegamenti:
function admin_menu_items() {
global $menu;
$storemenu = $menu[15];//salva il menu collegamenti in $storemenu
$menu[15] = $menu[5];//rende il menu collegamenti uguale al menu articoli
$menu[5] = $storemenu; //rende il menu 5/articoli uguale a $storemenu/collegamenti
}
add_action('admin_menu', 'admin_menu_items');
Uso questo trucco da un po' di tempo, testato con WP 3.4.1

Fantastico. Grazie mille. Ho appena inserito alcune righe di codice nel mio functions.php
require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
swap_admin_menu_sections('Pages','Posts'); // Scambia la posizione della sezione Post con quella Pagine
}
Inoltre ho posizionato il file wp-admin-menu-classes.php nella cartella del mio tema e ora il pulsante 'Post' è scambiato con quello 'Pagine'.
Spero che questa funzionalità venga presto integrata nel core in modo che non sia necessario scrivere l'intero menu all'interno di una funzione solo per riordinare due pulsanti.
In effetti è stato un po' complicato ottenere un ordine più specifico per 4 pulsanti. Per cambiare l'ordine di 4 pulsanti in: Pagine, Post, Media, Link Ho dovuto usare il seguente codice:
swap_admin_menu_sections('Pages','Posts');
swap_admin_menu_sections('Media','Links');
swap_admin_menu_sections('Posts','Links');
