¿Cambiar el orden de las secciones del menú Admin?

31

Me siento un poco frustrado aquí después de haber pasado algunas horas tratando de lograr esta tarea bastante simple sin suerte.

Básicamente, tengo 5 tipos de publicaciones personalizadas que creé y todo lo que quiero hacer es mostrar cada una de ellas en un orden específico directamente debajo del "tablero" .

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

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

Siga adelante e intente crear 5 tipos de publicaciones separadas e inclúyalas en un orden específico directamente debajo del tablero ... parece que esto no es posible. ?? ... ¿hay algún tipo de truco de jquery para que esto funcione? podría compartir conmigo o preferiblemente sin utilizar jQuery?

Binarybit
fuente

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é lo que estaban pensando cuando lo diseñaron de esa manera.

@EAMann hizo un excelente trabajo al explicar 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 descubrir cómo funcionaba, aún no sabía cómo trabajar con él sin dedicar el tiempo suficiente para mantener la cabeza recta 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 aún están en alfa ya que he sido 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 colocarlo 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 functions.phparchivo 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!

MikeSchinkel
fuente
¡Fantástica adición a la API! Me tomó meses agregar mi primera sección de menú personalizado con el marco existente (por eso estudié mucho el código) ... ¡pero su API parece mucho más intuitiva de usar!
EAMann
@EAMann - ¡Gracias! Si desea ofrecer alguna sugerencia o incluso colaborar para mejorarla, me encantaría establecer algo que podría facilitarlo a todos, excepto a los pocos que vean estas preguntas y respuestas.
MikeSchinkel
¿Esto es esencial o todavía se requiere esto o algo similar para manipular el orden de los elementos del menú en el administrador?
Q Studio
Por lo que he encontrado, se ha pospuesto a WP 3.5
pixeline
Hola Mike: wp_debug arroja 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); volver $ sección; } --- Aviso: Variable indefinida: sección
Q Studio
21

Aquí hay un tutorial rápido de cómo se construye el menú de administración de WordPress: no estoy hablando de la add_menu_pageAPI, me refiero al menú predeterminado de WordPress.

Llamar al archivo de 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. Por el contrario, todo el menú (todas las opciones posibles, submenús, etc.) se cargan a través de una matriz simple que se define en wp-admin/menu.php.

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

Cargando el menú

El menú en sí se almacena en la matriz global $menu. De acuerdo con 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 tablero, por ejemplo, es:

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

El archivo pasa y carga cada elemento de menú en la matriz y carga todos sus elementos de submenú en una matriz llamada $submenuíndices basados ​​en la url del menú principal. Entonces, el elemento del submenú del Tablero llamado "Tablero" es:

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

Después de que el sistema haya terminado de cargar todos los menús (no hay tantos, pero el sistema pasa por el índice en 5 o 10 a la vez ... observe que el Tablero, aunque es el primer elemento del menú, todavía está indexado como elemento "2" (las matrices PHP comienzan en el índice 0 ... así que esto le da un poco de margen de maniobra).

En este punto, el sistema llama 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 recorre las páginas principales y hace lo mismo. Luego, elimina los separadores duplicados que quedan de haber eliminado los menús.

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

Ordenar menús personalizados

Se admin_menullama al gancho después de configurar los menús, pero antes de ordenar algo. Por lo tanto, es posible ordenar todo el sistema de menús de WordPress sin "hackear" la API.

Una vez que se activa la acción admin_menu, sus páginas personalizadas se cargan en el sistema. Lo siguiente que sucede es que WordPress comprueba un filtro llamado custom_menu_order... este filtro siempre se devuelve falsey le dice a WordPress si desea o no usar un pedido personalizado.

Agregue lo siguiente a su tema para establecer la bandera en su truelugar y defina su orden explícito de 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');

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


EDITAR (2/9/2010):

Para especificar el orden de la pantalla de edición de un tipo de publicación personalizado utilizando este método, debe conocer la URL de la pantalla de edición. En la mayoría de los casos, lo 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 el slug del tipo de publicación personalizada que está utilizando.

Por ejemplo...

Supongamos que tiene un tipo de publicación personalizado para 'Preguntas de intercambio de pila' y desea que el editor aparezca en la misma sección que el tablero directamente debajo del icono del tablero. Usaría el siguiente código en el functions.phparchivo 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 tablero y aparecerá inmediatamente debajo de ella. 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.

EAMann
fuente
Hay un pequeño error en el código de ejemplo, bajo el título "menús personalizados de pedido", la declaración condicional si no se encuentra el $en el nombre de la variable ... (Gran respuesta, aunque) ..
t31os
¿Cómo agregaría el tipo de publicación personalizada para "Preguntas de intercambio de pila" a una sección debajo de la sección Panel de control?
epaps
Hola EAMann: pregunta rápida. ¿Desde la última versión de WordPress este proceso ha cambiado o se ha vuelto más simple?
NetConstructor.com
¿Qué tal para submenús ? ¿Existe un método similar para reorganizar los elementos del submenú ?
Giraldi
@GiraldiMaggio Haga una nueva pregunta y haga referencia a esta.
EAMann
18

Me doy cuenta de que este es un hilo viejo, 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.

Ver: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Modificado ligeramente para satisfacer las necesidades del póster original (aunque espero que haya encontrado una solución por ahora ...).

  // 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 a la parte inferior del menú.

Mate
fuente
1
Sí, esto es mucho mejor, también para reordenar elementos del submenú que puede desarmar y luego restablecerlos.
Wyck
2

Entiendo que no desea usar un complemento, pero por pura simplicidad, pruebe el complemento Admin Menu Editor de Janis Elsts. Reorganice sus menús de administrador de la forma que desee; También puede ocultar elementos del menú.

Ray Gulick
fuente
Probé este complemento en la instalación multisitio. Funciona mejor, pero necesitamos configurar manualmente las opciones para cada subsitio si tenemos una instalación multisitio.
user391
2

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

Por ejemplo, si quisiera mover el menú "Páginas" al final de los menús, usaría esto functions.phpo 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 Publicaciones y Enlaces:

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

He estado usando este truco un poco, solo lo probé con WP 3.4.1

forlogos
fuente
Sé que esta es una publicación anterior, pero con respecto a su primer fragmento me encontré con un problema con la última línea en la admin_menu_itemsfunción que se corrigió reemplazándola porunset($menu[20]);
hot_barbara
0

Increíble. Muchas gracias. Acabo de poner algunas líneas de código en mis funciones.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, coloca el wp-admin-menu-classes.php en mi carpeta de temas y ahora el botón de 'publicaciones' se intercambia con el botón de 'páginas'.

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

De hecho, fue un poco complicado obtener un orden más específico para 4 botones. Para cambiar los 4 botones a: Páginas, Publicaciones, 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');
Sebastian
fuente