¿Cambiar el orden de las secciones del menú de administración?

30

Me estoy frustrando un poco por aquí después de haber pasado algunas horas tratando de realizar esta tarea bastante simple sin ninguna suerte.

Esencialmente tengo 5 tipos de publicaciones personalizadas que creé y todo lo que quiero hacer es mostrar cada uno de ellos en un orden específico directamente debajo del "panel" .

De la documentación de WordPress parece que realmente no puedes hacer esto porque el orden de menú más alto parece ser "5". Y por encima L

Supongo que algunos expertos que leen esto pueden mostrarme la forma sencilla en que puedo ordenar el menú de administración exactamente como quiero utilizando el archivo de funciones y sin utilizar un complemento (que sé que existe).

Por favor, adelante, intente crear 5 tipos de publicaciones separadas e inclúyalas en un orden específico directamente debajo del panel de control ... parece que esto no es posible. ?? ... ¿hay algún tipo de truco de jQuery para hacer esto? ¿El trabajo que alguien podría compartir conmigo o preferiblemente sin utilizar jQuery?

    
pregunta Binarybit 02.09.2010 - 01:46

6 respuestas

33

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 obtusas y frustrantes a través del núcleo de WordPress. Honestamente, no sé qué pensaban cuando lo diseñaron de esa manera.

@EAMann hizo un trabajo excelente de explicar cómo funcionan los menús de administrador en WordPress (me gustaría haber podido leer eso acerca de Hace 4 meses ... :)

Aún así, después de que descubrí cómo funcionaba, todavía no podía trabajar con él sin dedicar el tiempo suficiente para mantener mi cabeza recta mientras trataba de hacer cosas simples. Es por eso que creé 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 aún están muy en alfa desde que soy el único que lo usa. Estoy seguro de que hay casos de uso que aún no manejan. Pero publicaré el código aquí para que usted y otros lo prueben.

Puede descargar el archivo para colocar en el directorio de su tema aquí: wp-admin -menu-classes.php y lo que sigue 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
}

Lo que es más, estas funciones son incluso en consideración (como base) para su inclusión en WordPress 3.1 así que si tenemos suerte, ¡esto podría incluso convertirse en estándar!

    
respondido por el MikeSchinkel 02.09.2010 - 03:56
20

Este es un breve recorrido de cómo se crea el menú de administración de WordPress: no estoy hablando del add_menu_page API, me refiero al menú de WordPress predeterminado real.

Llamando el archivo de menú

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

Entonces, para cargar el sistema de menús, admin.php just require s menu.php ... alrededor de la línea 99 en WordPress 3.0.

Cargando el menú

El menú en sí está almacenado en la matriz global $menu . Según la documentación en línea, la matriz del menú tiene estos elementos:

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

El panel de control, por ejemplo, es:

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

El archivo avanza y carga cada elemento del menú en la matriz y carga todos sus elementos del submenú en una matriz llamada $submenu que se indexa según la URL del menú principal. Por lo tanto, el elemento del submenú del Panel de control llamado "Panel de control" es:

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

Una vez que el sistema haya terminado de cargar todos los menús (no hay muchos, pero el sistema avanza el índice a la vez en 5 o 10 ... observe que el Tablero de instrumentos, aunque es el primer elemento del menú, es aún indexado como elemento "2" (las matrices de PHP comienzan en el índice 0 ... así que esto le da un poco de espacio de maniobra).

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

Pasando por el menú

Este tercer archivo recorre cada elemento del menú y, según los privilegios asignados al usuario actual, utiliza 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 pasa por las páginas principales y hace lo mismo. Luego elimina cualquier separador duplicado que quede de haber eliminado los menús.

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

Ordenar menús personalizados

Se llama al gancho admin_menu después de configurar los menús pero antes se ordena cualquier cosa. Por lo tanto, es posible ordenar todo el sistema de menús de WordPress sin "piratear" la API.

Después de que se haya activado la acción admin_menu , sus 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 se devuelve false y le dice a WordPress si desea usar un orden personalizado o no.

En su lugar, agregue lo siguiente a su tema para establecer el indicador en true y defina su orden de menú explícito:

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

Especifique el orden que desea para todos los menús (proporcioné referencias al archivo de carga de menú para que pueda obtener una lista de nombres de archivos) y esto debería hacerse cargo de ello.

EDITAR (9/2/2010):

Para especificar el orden de la pantalla de edición de un tipo de publicación personalizada mediante este método, debe conocer 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=POST_TYPE . Esto depende de cómo se configura WordPress en su sitio (si está instalado en la raíz o en una subcarpeta) y la barra del tipo de publicación personalizada que esté usando.

Por ejemplo ...

Supongamos que tiene un tipo de publicación personalizada para "Preguntas de intercambio de pila" y desea que el editor aparezca en la misma sección que el panel de control, justo debajo del icono del panel de control. Usaría el siguiente código en el archivo functions.php de su 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 su página de edición personalizada se moverá a la misma sección que el panel y aparecerá inmediatamente debajo. Puede usar esto para mover sus tipos de publicaciones personalizadas a cualquier sección del menú de administración y colocarlas en cualquier orden. También puede mover elementos de menú estándar de la misma manera.

Solo asegúrese de especificar el orden de todos los elementos del menú en la sección dada , de lo contrario, su menú podría estar sujeto a alguna rareza inesperada.

    
respondido por el EAMann 02.09.2010 - 03:22
18

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

Consulte: enlace . Modificado ligeramente para adaptarse a las necesidades del póster original (aunque espero que haya encontrado una solución a estas alturas ...).

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

No se eliminarán los elementos del menú de administración que no se enumeran aquí. Se agregarán al final del menú.

    
respondido por el Matt 20.12.2012 - 20:21
2

Comprendo que no desea utilizar un complemento, pero para mayor simplicidad, pruebe el complemento Admin Menu Editor de Janis Elsts. Reorganiza tus menús de administrador de la forma que quieras; También puede ocultar elementos de menú.

    
respondido por el Ray Gulick 04.09.2010 - 19:53
2

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

Por ejemplo, si quisiera mover el menú "Páginas" a la parte inferior de los menús, lo usaría en functions.php o en un complemento:

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

y si quisiera intercambiar los menús de Publicaciones y Vínculos:

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

Estuve usando este truco por un tiempo, solo lo probé con WP 3.4.1

    
respondido por el forlogos 08.11.2012 - 21:58
0

Impresionante. Muchas gracias. Acabo de poner algunas líneas de código en 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'); // Swop location of Posts Section with Pages Section
}

Además de colocar wp-admin-menu-classes.php en la carpeta de mi tema y ahora se pulsa el botón "publicaciones" con el botón 'páginas'.

Espero que esto se convierta en parte del núcleo pronto y de manera que no tengamos que escribir todo el menú dentro de una función para simplemente reordenar dos botones.

De hecho, fue un poco difícil obtener un orden más específico para 4 botones. Para cambiar los 4 botones a: Páginas, Publicación, Medios, Enlaces Necesitaba usar el siguiente código:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
    
respondido por el Sebastian 05.03.2012 - 06:36

Lea otras preguntas en las etiquetas