Representacin con lineas sencillas del concepto "Refactorizacion de la rutina de ordenacion de menus"

WordPress Inclusivo 19: Refactorizando el código que ordena el menú admin

En la anterior entrega creamos un código que ordenaba los menús de administración en WordPress, hoy lo optimizaremos.

Partimos del siguiente código:

/* 
===================================================
  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 );

El aspecto que más llama la atención es que repetimos un proceso casi idéntico dos veces, uno para el menú principal y otro para cada uno de los submenús, parece lógico extraer ese algoritmo a una función que podamos llamar para cada uno de los elementos a ordenar, evitando así repetir código:

function com_metsuke_sort_admin_menu() {
  global $menu;
  global $submenu;

  // Ordena los menus
  $menu = com_metsuke_sort_admin_menu_options($menu,1);

  // Ordena los submenús.
  foreach ($submenu as &$token) {
    $token = com_metsuke_sort_admin_menu_options($token,1);
  }
  unset($token);
}

function com_metsuke_sort_admin_menu_options($menuItems,$menuTopCount=1) {
  // Ordena elementos iniciales ($menuTopCount)
  $default = array_slice( $menuItems, 0, $menuTopCount, true );
  usort( $default, 'com_metsuke_sort_admin_menu_sort_options' );

  // Ordena el resto de elementos
  $length = count( $menuItems );
  $extra = array_slice( $menuItems,$menuTopCount, $length, true );
  usort( $extra, 'com_metsuke_sort_admin_menu_sort_options' );

  // 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
  return array_merge( $default, $extra );

}

//http://stackoverflow.com/a/1597788/1287812
function com_metsuke_sort_admin_menu_sort_options( $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', 'com_metsuke_sort_admin_menu', 999 );

Además de separar la función, he renombrado todas evitando las colisiones con otras funciones usando el prefijo com_metsuke.

Puede parecer una refactorización básica, pero nos permite pasar de un código algo complejo a uno en el que la estructura está clara y separada de las funciones que ejecutan las diferentes tareas, lo que aumenta mucho su mantenibilidad.

No olvides observar este tipo de cosas al escribir tu código, una vez has logrado que funcione, simplificalo en la medida de lo posible.

¡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!