Modificare l'Ordine delle Sezioni del Menu di Amministrazione?

2 set 2010, 02:46:38
Visualizzazioni: 40.3K
Voti: 31

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?

0
Tutte le risposte alla domanda 6
5
35

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!

2 set 2010 04:56:40
Commenti

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 EAMann
2 set 2010 07:10:59

@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.

MikeSchinkel MikeSchinkel
3 set 2010 11:19:16

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?

Q Studio Q Studio
12 set 2012 17:16:15

Per quanto ho scoperto, è stato posticipato a WP 3.5

pixeline pixeline
23 set 2012 01:23:13

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

Q Studio Q Studio
11 ott 2012 12:57:58
5
23

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.

2 set 2010 04:22:33
Commenti

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)...

t31os t31os
17 nov 2010 17:24:33

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

epaps epaps
31 mag 2011 07:32:21

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

NetConstructor.com NetConstructor.com
14 set 2011 22:26:40

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

Giraldi Giraldi
16 nov 2012 11:47:36

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

EAMann EAMann
16 nov 2012 19:09:25
1
20

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.

20 dic 2012 21:21:52
Commenti

Sì, questa soluzione è molto migliore. Inoltre, per riordinare le voci del sottomenu puoi prima rimuoverle e poi reinserirle nell'ordine desiderato.

Wyck Wyck
20 dic 2012 22:11:41
1

Capisco che non vuoi usare un plugin, ma per semplicità assoluta, prova il plugin Admin Menu Editor di Janis Elsts. Puoi riorganizzare i menu di amministrazione come preferisci; puoi anche nascondere le voci di menu.

4 set 2010 20:53:07
Commenti

Ho provato questo plugin in un'installazione multisito. Funziona benissimo, ma dobbiamo configurare manualmente le opzioni per ogni sottosito se abbiamo un'installazione multisito.

user391 user391
13 ott 2010 18:07:11
1

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

8 nov 2012 22:58:37
Commenti

Sono consapevole che si tratta di un post più vecchio, ma riguardo al tuo primo snippet ho riscontrato un problema con l'ultima riga nella funzione admin_menu_items che è stato risolto sostituendola con unset($menu[20]);

hot_barbara hot_barbara
5 ago 2017 00:16:30
0

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');
5 mar 2012 07:36:58