Cambiare l'ordine delle sezioni del menu Admin?


31

Mi sento un po 'frustrato qui dopo aver trascorso alcune ore cercando di svolgere questo compito abbastanza semplice senza fortuna.

Essenzialmente ho 5 tipi di post personalizzati che ho creato e tutto quello che voglio fare è mostrarli ciascuno in un ordine specifico direttamente sotto la "dashboard" .

Dalla documentazione di WordPress sembra che non puoi davvero farlo perché l'ordine di menu più alto sembra essere "5". E sopra L

Immagino che qualche esperto leggendo questo può mostrarmi il modo semplice in cui posso ordinare il menu di amministrazione esattamente come voglio usando il file delle funzioni e senza usare un plugin (che so che esiste).

Vai avanti e prova a creare 5 tipi di post separati e includerli in un ordine specifico direttamente sotto il dashboard ... sembra che questo non sia possibile. ?? ... c'è qualche tipo di hack jquery per far funzionare questo qualcuno potrebbe condividere con me o preferibilmente senza utilizzare jQuery?

Risposte:


33

Ciao @BinaryBit:

Non c'è da meravigliarsi che tu sia un po 'frustrato; il menu di amministrazione è una delle implementazioni più ottuse e frustranti attraverso il core di WordPress. Onestamente, non so cosa stessero pensando quando l'hanno progettato in quel modo.

@EAMann ha fatto un ottimo lavoro nel spiegare come funzionano i menu di amministrazione in WordPress (vorrei poterlo leggere circa 4 mesi fa ... :)

Tuttavia, dopo aver capito come funzionava, non riuscivo ancora a lavorarci su senza dedicarmi abbastanza tempo per tenere la testa dritta mentre cercavo di fare cose semplici. Ecco perché ho creato un'API Menu che semplifica e semplifica l'utilizzo del menu di amministrazione di WordPress.

Sono compatibili al 100% con le strutture esistenti di WordPress e sono ancora molto alfa poiché sono stato l'unico ad usarlo. Sono sicuro che ci sono casi d'uso che non gestiscono ancora. Ma pubblicherò qui il codice affinché tu e gli altri lo proviate.

Puoi scaricare il file da rilasciare nella directory del tuo tema qui: wp-admin-menu-classes.php e quanto segue mostra come potresti chiamare le funzioni nel functions.phpfile 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');              // Swap location of Posts Section with Pages Section
  rename_admin_menu_section('Media','Photos & Video');    // Rename Media Section to "Photos & Video"
  delete_admin_menu_section('Links');                     // Get rid of Links Section
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Save off the Movie Tags Menu
  update_admin_menu_section('Movies',array(               // Rename two Movie Menu Items and Delete the Movie Tags Item
    array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
    array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
    array('delete-item','item'=>'Movie Tags'),
  ));
  copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Rename copied Actor 'Add New' to 'Add Actor
  add_admin_menu_item('Movies',array(                       // (Another way to get a 'Add Actor' Link to a section.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finally just get rid of the actors section
}

Inoltre, queste funzioni sono persino prese in considerazione (come base) per l'inclusione in WordPress 3.1, quindi se siamo fortunati queste potrebbero persino diventare standard!


Fantastica aggiunta all'API! Mi ci sono voluti mesi per aggiungere la mia prima sezione di menu personalizzata con il framework esistente (motivo per cui ho studiato molto il codice) ... ma la tua API sembra molto più intuitiva da usare!
EAMann

@EAMann - Grazie! Se vuoi offrire qualche suggerimento o anche collaborare per migliorarlo, mi piacerebbe che venisse stabilito qualcosa che possa rendere più facile per tutti, tranne per i pochi che vedono queste domande e risposte.
MikeSchinkel,

questo ha fatto il core o questo o qualcosa di simile è ancora necessario per manipolare l'ordine delle voci di menu nell'amministratore?
Q Studio

Per quanto ho trovato, è stato rinviato al WP 3.5
pixeline il

Ehi Mike - wp_debug genera un errore su questa funzione: -------- funzione 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); restituisce $ section; } --- Avviso: variabile non definita: sezione
Q Studio

21

Ecco una breve panoramica di come è costruito il menu di amministrazione di WordPress: non sto parlando add_menu_pagedell'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.phpbasta requires 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 $submenuindicizzato 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_menuviene 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 truee 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.phpfile 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.


C'è un piccolo errore nel tuo codice di esempio sotto l'intestazione "Ordinazione di menu personalizzati", $
nell'istruzione

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

Ciao EAMann - domanda veloce. Dalla versione più recente di wordpress questo processo è cambiato o è diventato più semplice?
NetConstructor.com

Che ne dici di sottomenu ? Esiste un metodo simile per riorganizzare gli elementi del sottomenu ?
Giraldi,

@GiraldiMaggio Fai una nuova domanda e fai riferimento a questa.
EAMann,

18

Mi rendo conto che questo è un vecchio thread, ma penso che valga la pena aggiornarlo con una soluzione MOLTO più semplice. Si noti che funziona con 3.5 e non è stato testato con nessuna altra versione. 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 soddisfare le esigenze del poster originale (però, spero che abbia trovato una soluzione ormai ...).

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      'separator2', // Second separator
      'themes.php', // Appearance
      'plugins.php', // Plugins
      'users.php', // Users
      'tools.php', // Tools
      'options-general.php', // Settings
      'separator-last', // Last separator
    );
  }

  add_filter('custom_menu_order', 'custom_menu_order'); // Activate custom_menu_order
  add_filter('menu_order', 'custom_menu_order');

Eventuali elementi nel menu di amministrazione che non sono elencati qui non verranno rimossi. Verranno aggiunti in fondo al menu.


1
Sì, è molto meglio, anche per riordinare gli elementi del sottomenu che è possibile annullare e quindi resettare.
Wyck,

2

Ci risulta che non desideri utilizzare un plug-in, ma per pura semplicità, prova il plug-in Editor menu Admin di Janis Elsts. Riorganizza i menu di amministrazione come preferisci; può anche nascondere voci di menu.


Ho provato questo plugin nell'installazione su più siti. Funziona meglio, ma dobbiamo configurare manualmente le opzioni per ogni sito secondario se disponiamo di un'installazione su più siti.
user391

2

Per spostare le voci di menu, mi piace usare la $menuvariabile globale .

Ad esempio, se volessi spostare il menu "Pagine" nella parte inferiore dei menu, lo utilizzerei in functions.phpo in un plug-in:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

e se volessi scambiare i menu Post e Link:

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

Ho usato questo trucco per un po ', appena testato con WP 3.4.1


So che questo è un post più vecchio, ma per quanto riguarda il tuo primo frammento ho riscontrato un problema con l'ultima riga nella admin_menu_itemsfunzione che è stato risolto sostituendolo conunset($menu[20]);
hot_barbara

0

Eccezionale. Grazie mille. Ho appena inserito alcune righe di codice nel mio function.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'); // Swop location of Posts Section with Pages Section
}

Inoltre, inserendo wp-admin-menu-classes.php nella mia cartella dei temi e ora il pulsante "post" viene visualizzato con il pulsante "pagine".

Spero che questo diventi presto parte del core e in modo tale da non dover scrivere l'intero menu all'interno di una funzione per riordinare solo due pulsanti.

In effetti è stato un po 'complicato ottenere un ordine più specifico per 4 pulsanti. Per modificare i 4 pulsanti in: Pagine, Posta, 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');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.