WordPress Inclusivo 18: Ordenar alfabeticamente el menú de administración

WordPress es a veces una plataforma llena de contradicciones, una de ellas, es el galimatías en que se convierte el menú de administración cuando nuestra web está en producción con algunos plugins, hoy solucionaremos esto.

Para lograrlo estuve buscando en la red como se hacía para modificar el orden de elementos del menú y uniendo lo encontrado con código propio he creado lo siguiente, que agrego a functions.php:

/* 
===================================================
  Mejoras al entorno de administración 
===================================================
*/

function sort_admin_menu() {

  global $menu;
  global $submenu;

  // Ordena los menús
  // Ordena elementos iniciales (1)
  $default = array_slice( $menu, 0, 1, true );
  usort( $default, 'sort_arra_asc_so_1597736' );

  // Ordena el resto de elementos
  $length = count( $menu );
  $extra = array_slice( $menu,1, $length, true );
  usort( $extra, 'sort_arra_asc_so_1597736' );
		
  // Mantener un solo separador si los hay.
  $cleaned = array();
  foreach($extra as $review) {
    if($review[0]!="" || count($cleaned)==0) {
      array_push($cleaned,$review);
    }	
  }
  $extra = $cleaned;
  unset($cleaned);

  // Apply
  $menu = array_merge( $default, $extra );

  // Ordena los submenús.
  foreach ($submenu as &$token) {
    // Ordena elementos iniciales (1)
    $default = array_slice( $token, 0, 1, true );
    usort( $default, 'sort_arra_asc_so_1597736' );

    // Ordena el resto de elementos
    $length = count( $token );
    $extra = array_slice( $token,1, $length, true );
    usort( $extra, 'sort_arra_asc_so_1597736' );

    // Mantener un solo separador si los hay.
    $cleaned = array();
    foreach($extra as $review) {
      if($review[0]!="" || count($cleaned)==0) {
        array_push($cleaned,$review);
      }	
    }
    $extra = $cleaned;
    unset($cleaned);

    // Apply
    $token = array_merge( $default, $extra );
  }
  unset($token);
}

//http://stackoverflow.com/a/1597788/1287812
function sort_arra_asc_so_1597736( $item1, $item2 ) {
  if ($item1[0] == $item2[0]) return 0;
  return ( $item1[0] > $item2[0] ) ? 1 : -1;
}

/* Se usa admin_head y no admin_menu para evitar que plugins 
  como Site Kit mantengan su menu arriba a pesar de la 
  reordenacion.
		
  No usamos admin_init porque causa error de whitespace 
  extra en algunos entornos.
*/
add_action( 'admin_head', 'sort_admin_menu', 999 );

Comprendiendo este código paso a paso

Lo primero que hemos de saber es que se ordena por un lado el grupo de opciones principales del menú y por otro los elementos de cada uno de los submenús asociados a cada opción principal.

Cabe destacar que en en ambos casos se respeta la opción por defecto, que queda en la parte superior. Esto ocurre tanto con el Dashboard, como con , por ejemplo, “Entradas > Todas las Entradas”.

¿Porqué? porque las primeras opciones representan las opciones que se cargan por defecto al entrar al administrador en primer caso, o al pulsar el menú padre en el caso del resto. Quería respetar esa funcionalidad, pero únicamente en esa primera opción, el resto se ordenan alfabéticamente.

Estructura General

En esencia el código tiene tres elementos:

  1. La función que se encarga del proceso “sort_admin_menu”
  2. La función de comparación creada para ordenar los elementos “sort_arra_asc_so_1597736”
  3. Finalmente la instrucción “add_action” que vincula el hook “admin_head” a la función de ordenación.

sort_admin_menu()

Veamos como funciona esta parte, que es llamada en el momento establecido.

Lo primero que hace es obtener acceso a los arrays de menús principales y de submenús, que son variables globales.

Una vez obtenido acceso, comienza trabajando con las opciones principales, como hemos dicho, por un lado se sitúa el primer elemento y a continuación se ordenan el resto de elementos alfabéticamente.

Esto se realiza básicamente obteniendo en dos array diferentes dos slices del array completo, y ordenando cada uno por separado, usando la función de comparación personalizada “sort_arra_asc_so_1597736” quedando asegurado que el orden es el deseado.

Tras esto se vuelven a unir ambas partes y con un bucle sencillo, nos aseguramos de eliminar todos salvo un separador de menú, dejando separadas primera opción y resto.

Una vez completado el proceso con las opciones principales, se hace exactamente lo mismo para cada lista de submenús, iterando con un foreach.

E voilá, menú ordenado. Soy consciente de que se puede refactorizar este código, de momento la idea era que funcionara y explicarlo, en el próximo capítulo nos encargaremos precisamente de esto, dejarlo compacto y bonito.

¡Lucha contra el Imperio compartiéndolo en tus redes!

Ayudame a difundir este contenido a todo aquel que pueda sacarle partido, difundelo en redes, cuéntaselo a tus amigos, coméntalo en la cola del supermercado, además de aportar, ¡seguro que conoces a gente interesante y acabas uniéndose al bando rebelde!

Dibujo de un sable laser para ciegos con la estrella de la muerte de fondo

¿Quieres ayudar a mantener viva la esperanza?

Pârticipa de esta comunidad y ayúdame a sufragar los costes que supone mantener vivo este proyecto, de este modo podré seguir trabajando en la línea en que lo estoy haciendo.

Puedes donar la cantidad que quieras a través de mi página en Paypal.me, si te resulta más cómodo.

¿Quieres aportar algo o indicarme algún aspecto que te gustaría que abordara? reflejalo en los comentarios del formulario de paypal.

Recuerda ¡Si me lo indicas en los comentarios de paypal te nombraré en el siguiente capítulo de Metsuke Podcast como mecenas!

Quizá te interese ...

Una Respuesta a “WordPress Inclusivo 18: Ordenar alfabeticamente el menú de administración”

Dejar una Respuesta

XHTML: Usted puede usar las siguientes etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>