¿Cambiar el Orden de las Secciones del Menú de Administración?

2 sept 2010, 02:46:38
Vistas: 40.3K
Votos: 31

Me estoy frustrando un poco después de haber pasado algunas horas tratando de lograr esta tarea aparentemente simple sin éxito.

Básicamente, tengo 5 tipos de publicación personalizados que creé y todo lo que quiero hacer es mostrar cada uno de ellos en un orden específico directamente debajo del "escritorio".

Según la documentación de WordPress, parece que realmente no se puede hacer esto porque el orden más alto del menú parece ser "5". Y por encima de eso.

Supongo que algún experto que lea esto puede mostrarme la manera simple en que puedo ordenar el menú de administración exactamente como quiero utilizando el archivo functions.php y sin utilizar un plugin (que sé que existe).

Por favor, adelante e intenten crear 5 tipos de publicación separados e incluirlos en un orden específico directamente debajo del escritorio... parece que esto no es posible... ¿hay algún tipo de solución con jQuery para hacer que esto funcione que alguien podría compartir conmigo o preferiblemente sin utilizar jQuery?

0
Todas las respuestas a la pregunta 6
5
35

Hola @BinaryBit:

No es de extrañar que estés un poco frustrado; el menú de administración es una de las implementaciones más confusas y frustrantes del núcleo de WordPress. Sinceramente, no sé en qué estaban pensando cuando lo diseñaron de esa manera.

@EAMann hizo un excelente trabajo explicando cómo funcionan los menús de administración en WordPress (ojalá hubiera podido leer eso hace unos 4 meses... :)

Aún así, después de entender cómo funcionaba, todavía me costaba trabajar con él sin dedicar suficiente tiempo para mantener la cabeza clara mientras intentaba hacer cosas simples. Por eso construí una API de Menú que simplifica y agiliza el trabajo con el menú de administración de WordPress.

Son 100% compatibles con las estructuras existentes de WordPress y todavía están en fase alfa, ya que he sido el único que las ha usado. Estoy seguro de que hay casos de uso que aún no manejan. Pero compartiré el código aquí para que tú y otros lo prueben.

Puedes descargar el archivo para incluir en el directorio de tu tema aquí: wp-admin-menu-classes.php y lo siguiente muestra cómo podrías llamar a las funciones en el archivo functions.php de tu 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');              // Intercambia la ubicación de la sección Posts con Pages
  rename_admin_menu_section('Media','Photos & Video');    // Renombra la sección Media a "Photos & Video"
  delete_admin_menu_section('Links');                     // Elimina la sección Links
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Guarda el menú Movie Tags
  update_admin_menu_section('Movies',array(               // Renombra dos elementos del menú Movies y elimina Movie Tags
    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')); // Copia 'Add New' desde Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Renombra el 'Add New' copiado de Actors a 'Add Actor'
  add_admin_menu_item('Movies',array(                       // (Otra forma de obtener un enlace 'Add Actor' en una sección.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Añade Movie Tags al final.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Añade Movie Tags al final.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finalmente, elimina la sección Actors
}

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

2 sept 2010 04:56:40
Comentarios

¡Fantástica adición a la API! Me tomó meses agregar mi primera sección de menú personalizado con el framework existente (por eso estudié tanto el código)... ¡pero tu API parece mucho más intuitiva de usar!

EAMann EAMann
2 sept 2010 07:10:59

@EAMann - ¡Gracias! Si quieres ofrecer alguna sugerencia o incluso colaborar para mejorarla, me encantaría establecer algo que pudiera facilitarlo para todos, no solo para los pocos que ven esta Q&A.

MikeSchinkel MikeSchinkel
3 sept 2010 11:19:16

¿esto se integró al núcleo o todavía se requiere esto o algo similar para manipular el orden de los elementos del menú en el administrador?

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

Hasta donde he encontrado, ha sido pospuesto para WP 3.5

pixeline pixeline
23 sept 2012 01:23:13

Hola Mike - wp_debug muestra un error en esta función: -------- 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; }


Aviso: Variable no definida: section

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

Aquí hay un recorrido rápido de cómo se construye el menú de administración de WordPress - no me refiero a la API add_menu_page, sino al menú predeterminado real de WordPress.

Llamando al Archivo del Menú

El menú es, obviamente, cargado por wp-admin/admin.php. Pero no se carga a través de la API estándar que estamos acostumbrados a usar según la documentación de WordPress. Más bien, todo el menú (todas las opciones posibles, submenús, etc.) se carga mediante un simple arreglo definido en wp-admin/menu.php.

Para cargar el sistema de menú, admin.php simplemente hace un require de menu.php... alrededor de la línea 99 en WordPress 3.0.

Cargando el Menú

El menú en sí se almacena en el arreglo global $menu. Según la documentación en línea, el arreglo del menú tiene estos elementos:

Los elementos en el arreglo son:
    *     0: Nombre del elemento del menú
    *     1: Nivel mínimo o capacidad requerida.
    *     2: La URL del archivo del elemento
    *     3: Clase
    *     4: ID
    *     5: Icono para el menú de nivel superior

El Escritorio, por ejemplo, es:

$menu[2] = array( __('Escritorio'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

El archivo recorre y carga cada elemento del menú en el arreglo y carga todos sus subelementos en un arreglo llamado $submenu que se indexa según la URL del menú padre. Así que el subelemento del Escritorio llamado "Escritorio" es:

 $submenu[ 'index.php' ][0] = array( __('Escritorio'), 'read', 'index.php' );

Después de que el sistema termina de cargar todos los menús (no hay muchos, pero el sistema avanza por el índice de 5 o 10 en 10... nota que el Escritorio, aunque es el primer elemento del menú, todavía está indexado como elemento "2" (los arreglos de PHP comienzan en el índice 0... así que esto te da un poco de margen de maniobra).

En este punto, el sistema llama a wp-admin/includes/menu.php.

Recorriendo el Menú

Este tercer archivo recorre cada elemento del menú y, basado en los privilegios asignados al usuario actual, o bien usa el menú o lo elimina. Primero recorre todos los submenús y elimina las páginas a las que el usuario no puede acceder. Luego recorre las páginas principales y hace lo mismo. Luego elimina cualquier separador duplicado que quede de haber eliminado menús.

Finalmente, ordena los menús según su orden asignado.

Ordenando menús personalizados

El hook admin_menu se llama después de configurar los menús pero antes de que se ordene algo. Así que es posible ordenar todo el sistema de menús de WordPress sin "hackear" la API.

Después de que se dispara la acción admin_menu, tus páginas personalizadas se cargan en el sistema. Lo siguiente que sucede es que WordPress verifica un filtro llamado custom_menu_order... este filtro siempre devuelve false y le dice a WordPress si quieres usar un orden personalizado o no.

Añade lo siguiente a tu tema para establecer la bandera en true en lugar de false y definir tu orden explícito del menú:

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');

Especifica el orden que deseas para todos los menús (proporcioné referencias al archivo de carga del menú para que puedas obtener una lista de nombres de archivos) y esto debería encargarse de ello.


EDITADO (2/9/2010):

Para especificar el orden de la pantalla de edición de un tipo de publicación personalizado usando este método, necesitas saber la URL de la pantalla de edición. En la mayoría de los casos, será http://blog.url/wp-admin/edit.php?post_type=TIPO_DE_PUBLICACION. Esto depende de cómo esté configurado WordPress en tu sitio (si está instalado en la raíz o en una subcarpeta) y el slug del tipo de publicación personalizado que estés usando.

Por ejemplo...

Digamos que tienes un tipo de publicación personalizado para 'Preguntas de Stack Exchange' y quieres que el editor aparezca en la misma sección que el Escritorio, directamente debajo del icono del Escritorio. Usarías el siguiente código en el archivo functions.php de tu 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');

El resto del menú no se verá afectado, pero tu página de edición personalizada se moverá a la misma sección que el Escritorio y aparecerá inmediatamente debajo de él. Puedes usar esto para mover tus tipos de publicación personalizados a cualquier sección del menú de administración y colocarlos en cualquier orden. También puedes mover elementos del menú estándar de la misma manera.

Solo asegúrate de especificar el orden de todos los elementos del menú en la sección dada, de lo contrario, tu menú podría estar sujeto a algunas rarezas inesperadas.

2 sept 2010 04:22:33
Comentarios

Hay un pequeño error en tu código de ejemplo bajo el encabezado "Ordenar menús personalizados", la declaración condicional if le falta el $ al nombre de la variable... (Aunque es una gran respuesta)...

t31os t31os
17 nov 2010 17:24:33

¿Cómo agregarías el tipo de entrada personalizada para "Preguntas de Stack Exchange" a una sección debajo de la sección del Panel de control?

epaps epaps
31 may 2011 07:32:21

Hola EAMann - pregunta rápida. ¿Con la versión más reciente de WordPress ha cambiado este proceso o se ha vuelto más simple?

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

¿Qué pasa con los submenús? ¿Existe un método similar para reorganizar los elementos del submenú?

Giraldi Giraldi
16 nov 2012 11:47:36

@GiraldiMaggio Por favor haz una nueva pregunta y referencia esta.

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

Me doy cuenta de que este es un hilo antiguo, pero creo que vale la pena actualizarlo con una solución MUCHO más fácil. Tenga en cuenta que esto funciona con la versión 3.5 y no se ha probado con ninguna otra versión. El siguiente código se puede colocar en un plugin o en el archivo functions.php.

Ver: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order. Modificado ligeramente para adaptarse a las necesidades del autor original (aunque espero que ya haya encontrado una solución...).

  // Reorganizar el menú de administración
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Escritorio
      'edit.php?post_type=custom_type_one', // Tipo personalizado uno
      'edit.php?post_type=custom_type_two', // Tipo personalizado dos
      'edit.php?post_type=custom_type_three', // Tipo personalizado tres
      'edit.php?post_type=custom_type_four', // Tipo personalizado cuatro
      'edit.php?post_type=custom_type_five', // Tipo personalizado cinco
      'separator1', // Primer separador
      'edit.php?post_type=page', // Páginas
      'edit.php', // Entradas
      'upload.php', // Medios
      'link-manager.php', // Enlaces
      'edit-comments.php', // Comentarios
      'separator2', // Segundo separador
      'themes.php', // Apariencia
      'plugins.php', // Plugins
      'users.php', // Usuarios
      'tools.php', // Herramientas
      'options-general.php', // Ajustes
      'separator-last', // Último separador
    );
  }

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

Cualquier elemento del menú de administración que no esté listado aquí no será eliminado. Se añadirán al final del menú.

20 dic 2012 21:21:52
Comentarios

Sí, esto es mucho mejor. Además, para reordenar los elementos del submenú, puedes eliminarlos y luego volver a configurarlos.

Wyck Wyck
20 dic 2012 22:11:41
1

Entiendo que no quieras usar un plugin, pero por simplicidad, prueba el plugin Admin Menu Editor de Janis Elsts. Reorganiza los menús de administración como prefieras; también puede ocultar elementos del menú.

4 sept 2010 20:53:07
Comentarios

Probé este plugin en una instalación multisitio. Funciona de maravilla. Pero necesitamos configurar manualmente las opciones para cada subsitio si tenemos una instalación multisitio.

user391 user391
13 oct 2010 18:07:11
1

Para mover elementos del menú, me gusta usar la variable global $menu.

Por ejemplo, si quisiera mover el menú "Páginas" al final de los menús, usaría esto en functions.php o en un plugin:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//hacer que el menú 102 sea igual al menú 20 (páginas)
    $menu[20]=array();//hacer que el menú original de páginas desaparezca

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

y si quisiera intercambiar los menús de Entradas y Enlaces:

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//guardar el menú de enlaces en $storemenu
    $menu[15] = $menu[5];//hacer que el menú de enlaces = menú de entradas
    $menu[5] = $storemenu; //hacer que el menú 5/entradas = $storemenu/enlaces   
}
add_action('admin_menu', 'admin_menu_items');

He estado usando este truco por un tiempo, recién probado con WP 3.4.1

8 nov 2012 22:58:37
Comentarios

Sé que esta es una publicación antigua, pero en relación con tu primer fragmento de código, me encontré con un problema en la última línea de la función admin_menu_items que se solucionó reemplazándola con unset($menu[20]);

hot_barbara hot_barbara
5 ago 2017 00:16:30
0

Increíble. Muchas gracias. Acabo de agregar algunas líneas de código a mi 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'); // Intercambia la ubicación de la sección de Posts con la sección de Pages
}

Además de colocar el archivo wp-admin-menu-classes.php en la carpeta de mi tema y ahora el botón de 'posts' se intercambia con el botón de 'pages'.

Espero que esto pronto forme parte del núcleo y de una manera que no necesitemos escribir todo el menú dentro de una función solo para reordenar dos botones.

De hecho, fue un poco complicado obtener un orden más específico para 4 botones. Para cambiar el orden de 4 botones a: Pages, Post, Media, Links Necesité usar el siguiente código:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
5 mar 2012 07:36:58