Ordenar elementos del menú de administración

8

En una nota relacionada con "¿ Cambiar el orden de las secciones del menú de administración? ", Estoy buscando una manera de ordenar alfabéticamente las entradas en cada subsección del área de administración de WordPress.

Actualmente, cada vez que se agrega un nuevo complemento, su entrada aparecerá en una ubicación aparentemente aleatoria en Configuración / Herramientas / Complementos, y a menudo es difícil localizar el nuevo elemento del menú. (Ya tengo muchos complementos, así que mis menús están bastante llenos).

Siendo que agrego y elimino complementos con bastante regularidad, preferiría no tener que ir continuamente a la página de configuración para un complemento de pedido de menú y ajustar el orden.

Perdón por la larga pregunta; Solo quiero dejar en claro lo que estoy buscando.

Ejemplo

En vez de:

    Configuraciones
    - general
    - Escritura
    - Leyendo
    - Discusión
    - (resto de artículos básicos)
    - Complemento 4
    - WP algo
    - Un complemento para ayudar con cosas
    - Complemento relacionado con Google
    - Complemento RSS
    - Complemento FeedBurner
    - etc.

¿Puedo ordenar el menú alfabéticamente (o por otro método lógico), por ejemplo:

    Configuraciones
    - Un complemento para ayudar con cosas
    - Discusión
    - Complemento FeedBurner
    - general
    - Complemento relacionado con Google
    - Complemento 4
    - Leyendo
    - (resto de artículos básicos)
    - Complemento RSS
    - WP algo
    - Escritura
    - etc.

Aún mejor sería un método de clasificación que mantiene las entradas principales donde están por defecto y solo clasifica los elementos agregados por complementos:

    Configuraciones
    - general
    - Escritura
    - Leyendo
    - Discusión
    - (resto de artículos básicos)
    - Un complemento para ayudar con cosas
    - Complemento FeedBurner
    - Complemento relacionado con Google
    - Complemento 4
    - Complemento RSS
    - WP algo
    - etc.
dgw
fuente

Respuestas:

4

Se puede hacer clasificando lo global $submenu.

La clasificación que se aplica restablece el número clave de la submatriz $submenu['options-general.php'], que es:

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

y se convierte en:

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

Aquí, estamos considerando la longitud de los elementos predeterminados igual a seis. Antes de WordPress 3.5, había 7 elementos, la privacidad ahora se ha ido e incrustado con la pestaña Lectura .

Probando localmente, esto no produce ningún resultado inesperado y funciona bien. Tal vez si un complemento dependiera de $submenu['options-general.php'][15]su posición u otra cosa, podrían ocurrir errores.

La ordenación se aplica por separado para los elementos predeterminados y para el resto de ellos. Simplemente desactive la usortdel primer bloque y tendrá la salida deseada.

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;
}

elementos de menú reordenados

brasofilo
fuente
3

Estaba buscando lo mismo y pensé que copiaría el código proporcionado por Mike a continuación, que según él todavía está en alfa ya que solo ha sido él quien lo ha estado usando.

Lo he probado y parece funcionar bien para mí. Estoy seguro de que hay casos de uso que aún no manejan.

Tal vez Mike haga comentarios aquí y proporcione ayuda adicional sobre cómo puede usar su clase para lograr sus objetivos.

Puede descargar el archivo para colocarlo en el directorio de su tema aquí: https://gist.github.com/792b7aa5b695d1092520

Lo que sigue a continuación muestra cómo puede llamar a las funciones en el archivo functions.php de su 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
}

Además, estas funciones están incluso bajo consideración (como base) para su inclusión en WordPress 3.1, por lo que, si tenemos suerte, ¡incluso podrían convertirse en estándar!

NetConstructor.com
fuente
Suena como un gran código, pero no veo dónde clasifica automáticamente las subentradas.
dgw
1

Pensé que esto podría ser útil como otra opción. Aquí hay un simple uso del submenú global $. Yo uso admin_init hook, porque admin_menu todavía puede tener otros complementos agregando elementos de submenú (en mi caso lo hizo, por lo que fue demasiado pronto para ordenar). También tenga en cuenta que la función anónima (lambda) en el usort requiere 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] );
        } );
    }
}

Tenga en cuenta que $submenu_keyestá $parent_slugen add_submenu_page , que es lo mismo que $menu_slugen add_menu_page .

ryanm
fuente
1
Agradable y compacto. ¿Qué es $submenu_keyrepresentar? ¿Es eso lo que WordPress llama $parent slugen los documentos add_submenu_page ?
random_user_name
@cale_b ¡Buena pregunta! Tienes razón, está $parent_slugen add_submenu_page docs, que es lo mismo que $menu_slugen add_menu_page.
ryanm