Pregunta

Me estoy haciendo un poco frustrado por aquí después de haber pasado un par de horas tratando de lograr esta tarea bastante simple, sin ninguna suerte.

Esencialmente tengo 5 tipos personalizados mensaje que he creado y todo lo que quiero hacer es mostrar cada uno de ellos en un orden específico directamente debajo de la "panel de control".

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

Supongo que algunos expertos de la lectura de este me puede mostrar la forma más sencilla que se me puede pedir el menú de administración exactamente de la manera que desee mediante la utilización de las funciones de archivo y sin la necesidad de utilizar un plugin (que sé que existe).

Por favor, seguir adelante y tratar de crear 5 tipos de mensaje y los incluyen en un orden específico directamente en el salpicadero...parece que esto no es posible.??...¿existe algún tipo de jquery hack para hacer este trabajo en el que alguien podría compartir conmigo o, preferiblemente, sin la necesidad de utilizar jQuery?

¿Fue útil?

Solución

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 de WordPress Core. Honestamente, no sé qué 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 (desearía haber podido leer eso hace unos 4 meses ... :)

Aún así, después de descubrir cómo funcionaba, todavía estaba perdido para trabajar con él sin dedicar suficiente tiempo para mantener la cabeza recta mientras intentaba hacer cosas simples. Por eso construí una API de menú Eso simplifica y racionaliza el trabajo con el menú de administración de WordPress.

Son 100% compatibles con las estructuras existentes de WordPress y aún son 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.

Puedes descargar El archivo que se lanzará 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 su tema functions.php expediente:

<?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 son incluso En consideración (como base) para su inclusión en WordPress 3.1 ¡Entonces, si tenemos suerte, esto incluso puede convertirse en estándar!

Otros consejos

He aquí un breve tutorial de cómo el menú de administración de WordPress es construido - no estoy hablando de la add_menu_page API, me refiero a la real por defecto de WordPress menú.

Llamar el Menú Archivo

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

Así que para cargar el sistema de menú, admin.php sólo requires menu.php ...alrededor de la línea 99 en WordPress 3.0.

Carga el Menú

El menú es almacenado en el array global $menu.De acuerdo a la documentación en línea, el menú de la matriz 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 a través y cargas de cada elemento de menú en la matriz de cargas y todos sus sub-elementos de menú en una matriz llamada $submenu que los índices basados en el menú principal de la url.Por lo que el Tablero de instrumentos del elemento de submenú llamado "Panel de control", es:

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

Después de que el sistema se termine de cargar todos los menús (no hay muchos, pero el sistema de medidas a través del índice en el tiempo por 5 o 10 ...observe que el cuadro de mandos, a pesar de que es el primer elemento del menú, todavía está indexada como elemento de "2" (arrays de PHP inicio en el índice 0 ...así que esto le da algo de margen de maniobra).

En este punto, el sistema de llamadas wp-admin/includes/menu.php.

Recorrer el Menú

Este tercer archivo camina a través de cada elemento del menú y, basado en los privilegios asignados para el usuario actual, utiliza el menú o la elimina.Primero se recorre todos los sub-menús y elimina las páginas que el usuario no pueda acceder.A continuación, se repite a través de las páginas para los padres y hace la misma cosa.A continuación, elimina los duplicados de los separadores que se conservan de haber eliminado a los menús.

Por último, ordena los menús basadas en sus asignado el orden en el menú.

El pedido de menús personalizados

El gancho admin_menu se llama después de que los menús son, pero antes de nada es ordenado.Por tanto, es posible que el fin de todo el sistema de menús de WordPress, sin necesidad de "hacking" de la API.

Después de la acción admin_menu de fuego, sus páginas personalizadas son cargados en el sistema.La próxima cosa que pasa, es WordPress cheques de un filtro llamado custom_menu_order ...este filtro es siempre devuelve false y le dice a WordPress si desea o no utilizar un pedido personalizado.

Añade lo siguiente a tu tema para establecer el indicador a true lugar y definir su explícito el orden en el 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');

Especificar el orden que desee para todos los menús (que suministra referencias al menú de carga de archivo de modo que usted puede obtener una lista de nombres de archivos) y esto debe tomar el cuidado de él.


EDITAR (9/2/2010):

Para especificar el orden de un tipo de mensaje personalizado de la pantalla de edición usando este método, usted necesita saber la URL de la pantalla de edición.Yo la mayoría de los casos, va a ser http://blog.url/wp-admin/edit.php?post_type=POST_TYPE.Esto depende de cómo WordPress en su sitio (si está instalado en la raíz o en una subcarpeta) y la indicación del tipo de mensaje personalizado que usted está utilizando.

Por ejemplo...

Digamos que usted tiene un tipo de mensaje personalizado para 'Intercambio de la Pila Preguntas" y desea que el editor aparecen en la misma sección que el panel directamente debajo del icono del panel.Tendría que utilizar el siguiente código en su tema functions.php archivo:

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á afectada, pero su costumbre de editar la página será movido a la sección de la misma como el tablero de instrumentos y aparecerá inmediatamente debajo de ella.Se puede utilizar para mover tu mensaje personalizado de los tipos a cualquier sección del menú de administración y colocarlos en cualquier orden.También puede mover ítems del menú estándar alrededor de la misma manera.

Sólo asegúrese de especificar el orden de todos los elementos de menú en la sección dada, de lo contrario, su menú puede ser objeto de algunas inesperadas rareza.

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 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 (sin embargo, 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é en la lista aquí no se eliminará. Se agregarán al final del menú.

Entiendo que no quiere usar un complemento, pero para obtener pura simplicidad, pruebe el complemento del editor del menú de administración de Janis Elsts. Reorganice sus menús de administración de cualquier forma que desee; También puede ocultar elementos del menú.

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

Por ejemplo, si quisiera mover el menú "páginas" a la parte inferior de los menús, usaría esto en functions.php o 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 quería cambiar las publicaciones y los menús de 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 probado con WP 3.4.1

Impresionante. 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, colocando el WP-Admin-Menu-Classes.php En mi carpeta de temas y ahora el botón 'Publicaciones' se basa con el botón '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 difícil obtener un pedido más especificado para 4 botones. Para cambiar los 4 botones a: páginas, publicaciones, medios de comunicación, enlaces, necesitaba usar el código Folowing:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Licenciado bajo: CC-BY-SA con atribución
scroll top