Ordina le voci del menu di amministrazione


8

In una nota correlata a " Cambiare l'ordine delle sezioni del menu Admin? ", Sto cercando un modo per ordinare alfabeticamente le voci in ogni sottosezione dell'area di amministrazione di WordPress.

Attualmente, ogni volta che viene aggiunto un nuovo plug-in, la sua voce apparirà in una posizione apparentemente casuale in Impostazioni / Strumenti / Plugin, ed è spesso difficile individuare la nuova voce di menu. (Ho già molti plugin, quindi i miei menu sono piuttosto pieni.)

Dato che aggiungo e rimuovo i plug-in abbastanza regolarmente, preferirei non dover andare continuamente nella pagina delle impostazioni per un plug-in per ordinare i menu e modificare l'ordine.

Ci scusiamo per la lunga domanda; Voglio solo chiarire cosa sto cercando.

Esempio

Invece di:

    impostazioni
    - Generale
    - Scrivere
    - Lettura
    - Discussione
    - (resto degli articoli principali)
    - Plugin 4
    - WP qualcosa
    - Un plugin per aiutare con le cose
    - Plug-in relativo a Google
    - Plug-in RSS
    - Plug-in FeedBurner
    - eccetera.

Posso ordinare il menu in ordine alfabetico (o con un altro metodo logico), ad esempio:

    impostazioni
    - Un plugin per aiutare con le cose
    - Discussione
    - Plug-in FeedBurner
    - Generale
    - Plug-in relativo a Google
    - Plugin 4
    - Lettura
    - (resto degli articoli principali)
    - Plug-in RSS
    - WP qualcosa
    - Scrivere
    - eccetera.

Ancora meglio sarebbe un metodo di ordinamento che mantiene le voci principali dove sono per impostazione predefinita e ordina solo gli elementi aggiunti dai plugin:

    impostazioni
    - Generale
    - Scrivere
    - Lettura
    - Discussione
    - (resto degli articoli principali)
    - Un plugin per aiutare con le cose
    - Plug-in FeedBurner
    - Plug-in relativo a Google
    - Plugin 4
    - Plug-in RSS
    - WP qualcosa
    - eccetera.

Risposte:


4

Si può fare ordinando il globale $submenu.

L'ordinamento applicato reimposta il numero chiave dell'array secondario $submenu['options-general.php'], ovvero:

array
  'options-general.php' => 
    array
      10 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      15 => 
        array
          0 => string 'Writing'
          1 => string 'manage_options'
          2 => string 'options-writing.php'
      // etc

e diventa:

array
  'options-general.php' => 
    array
      0 => 
        array
          0 => string 'Discussion'
          1 => string 'manage_options'
          2 => string 'options-discussion.php'
      1 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      // etc

Qui, stiamo considerando la lunghezza degli elementi predefiniti pari a sei. Prima di WordPress 3.5, c'erano 7 elementi, la privacy ora è sparita e incorporata nella scheda Lettura .

Test localmente, questo non produce alcun risultato imprevisto e funziona bene. Forse se un plugin dipendesse dal $submenu['options-general.php'][15]posizionamento di se stesso o di qualcos'altro, potrebbero verificarsi dei bug.

L'ordinamento viene applicato separatamente per gli elementi predefiniti e per il resto. Basta disabilitare il usortprimo blocco e hai l'output desiderato.

add_action( 'admin_menu', 'sort_settings_menu_wpse_2331', 999 );

function sort_settings_menu_wpse_2331() 
{
    global $submenu;

    // Sort default items
    $default = array_slice( $submenu['options-general.php'], 0, 6, true );
    usort( $default, 'sort_arra_asc_so_1597736' );

    // Sort rest of items
    $length = count( $submenu['options-general.php'] );
    $extra = array_slice( $submenu['options-general.php'], 6, $length, true );
    usort( $extra, 'sort_arra_asc_so_1597736' );

    // Apply
    $submenu['options-general.php'] = array_merge( $default, $extra );
}

//http://stackoverflow.com/a/1597788/1287812
function sort_arra_asc_so_1597736( $item1, $item2 )
{
    if ($item1[0] == $item2[0]) return 0;
    return ( $item1[0] > $item2[0] ) ? 1 : -1;
}

voci di menu riordinate


3

Stavo cercando la stessa cosa e ho pensato che avrei copiato il codice fornito da Mike al di sotto del quale afferma che è ancora molto in alpha poiché è stato solo lui a usarlo.

L'ho provato e sembra funzionare bene per me. Sono sicuro che ci sono casi d'uso che non gestiscono ancora.

Forse Mike commenterà qui e fornirà ulteriore aiuto su come puoi usare la sua classe per raggiungere i tuoi obiettivi.

Puoi scaricare il file da rilasciare nella directory del tuo tema qui: https://gist.github.com/792b7aa5b695d1092520

Quello che 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');              // 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!


Sembra un bel po 'di codice, ma non vedo dove ordina automaticamente le voci secondarie.
dgw,

1

Ho pensato che questo potesse essere utile come un'altra opzione. Ecco un semplice usort nel sottomenu $ globale. Uso il hook admin_init, perché admin_menu potrebbe avere ancora altri plugin che aggiungono elementi del sottomenu (nel mio caso, quindi era troppo presto per fare l'ordinamento). Nota anche che la funzione anonima (lambda) nell'usort richiede PHP 5.3+.

<?php 
add_action('admin_init','my_admin_init');
function my_admin_init() {
    global $submenu;
    $submenu_key = 'my_key'; // See note below on $submenu_key
    if ( array_key_exists( $submenu_key, $submenu ) ) {
        // alphabetize submenu items
        usort( $submenu[ $submenu_key ], function ( $a, $b ) {
            // format of a submenu item is [ 'My Item', 'read', 'manage-my-items', 'My Item' ]
            return strcasecmp( $a[0], $b[0] );
        } );
    }
}

Si noti che si $submenu_keytrova $parent_slugin add_submenu_page , che è uguale a $menu_slugin add_menu_page .


1
Bello e compatto. Cosa $submenu_keyrappresenta? È quello che WordPress chiama $parent slugnei documenti add_submenu_page ?
random_user_name

@cale_b Ottima domanda! Hai ragione, è $parent_slugnei documenti add_submenu_page, che è lo stesso $menu_slugdi add_menu_page.
Ryanm,
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.