it-swarm-es.com

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

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

Básicamente, 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 de "dashboard" .

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

Supongo que algunos expertos que leen esto pueden mostrarme la forma sencilla 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 panel de control ... parece que esto no es posible. ?? ... ¿Hay algún tipo de pirateo para hacer que esto funcione? ¿Podría compartir conmigo o preferiblemente sin utilizar jQuery?

31
Binarybit

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 unexcelentetrabajo de explicar cómo funcionan los menús de administración en WordPress (desearía haber podido leer eso hace unos 4 meses ... :)

Aún así, después de que descubrí cómo funcionaba, todavía no podía trabajar 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 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 colocar en el directorio de su tema aquí: wp-admin-menu-classes.php y lo que sigue muestra cómo podría 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 aún en consideración (como base) para su inclusión en WordPress 3.1 así que si tenemos suerte, ¡esto incluso podría convertirse en estándar!

33
MikeSchinkel

A continuación, le ofrecemos una breve descripción de cómo se crea el menú de administración de WordPress: no estoy hablando de la API add_menu_page, 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 usar según la documentación de WordPress. Más bien, todo el menú (todas las opciones posibles, submenús, etc.) se carga mediante una matriz simple que se define en wp-admin/menu.php.

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

Cargando el menu

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 tablero de instrumentos, 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 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. Así que 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 pasa por el índice a la vez en 5 o 10 ... observe que el Tablero de instrumentos, aunque es el primer elemento del menú, todavía está indexado como ítem "2" (las matrices de PHP comienzan en el índice 0 ... así que esto le da algo de espacio para maniobrar).

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

Paso a través del 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

El gancho admin_menu se llama después de configurar los menús pero antes de cualquier cosa se ordena. 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.

Agregue lo siguiente a su tema para establecer la bandera en true 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 de menú para que pueda obtener una lista de nombres de archivos) y esto debería hacerse cargo de ello.


EDITAR (2/09/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 el tipo de mensaje personalizado 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 directamente 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 de control 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.

21
EAMann

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: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Modificado ligeramente para adaptarse a 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');

Cualquier elemento en el menú de administración que no esté listado aquí no será eliminado. Se agregarán a la parte inferior del menú.

18
Matt

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 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 por un tiempo, solo lo probé con WP 3.4.1

2
forlogos

Entiendo 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ú.

2
Ray Gulick

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 de colocar el wp-admin-menu-classes.php en la carpeta de mi tema y ahora el botón "publicaciones" se cambia con el botón "páginas".

Espero que esto se convierta en parte del núcleo pronto y de una 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, Publicaciones, Medios, Vínculos, necesitaba usar el siguiente código:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
0
Sebastian