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.

¡Compártelo!

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!

Sígueme en Redes

Acelera mi progreso de la materia que te interesa.

El calendario y ritmo de publicaciones actualmente responde a mis necesidades de estudio y desarrollo de proyectos personales, si quieres invertir en que acelere alguna materia concreta, te ofrezco una posibilidad:

Puedes donar en mi paypal (paypal at metsuke.com), indicando la materia, por cada 25 euros donados, priorizaré un capítulo de la materia que me indiques que ya tenga escrito para que salga el proximo dia viable y disponible de lunes a viernes (en orden de llegada y a un post diario).

En caso de que el capítulo aún no exista, centraré mi atención en escribirlos y publicarlos con prioridad, pero no puedo prometer inmediatez.

De nuevo priorizaré las donaciones por orden de llegada pero cuando coincidan varias, iré rotando cada dia una para evitar la monopolización de mi foco de tareas.

Me reservo el fin de semana para priorizar lo que considere pertinente en el caso de que haya cola de entrega. Si te gusta el proyecto, ¡es un buen modo de apoyarme!

¿Te interesan mis servicios como consultor?

En ese caso, pudedes contactarme en mi correo r.carrillo@metsuke.com y cuéntame que necesitas, si lo que leo me gusta, te pongo en contacto con el comercial de mi empresa de consultoría.

Si quieres que sea yo expresamente quien te atienda, puedes indicármelo y llegamos a un acuerdo.

Advierto que esta última posibilidad te saldrá bastante más cara que hablar con mi equipo, pero si es lo que deseas, a tu disposición.

Un Abrazo.

Sobre las traducciones

Por el momento me he visto obligado a detener la traducción del contenido, apenas doy abasto a escribirlo (que es mi objetivo, ya que son mis apuntes de estudio), por lo que no parece tener sentido mantener activas unas traducciones que no doy abasto a crear.

En caso de que más adelante el flujo de caja me lo permita, es mi intención contratar servicios de traducción y editores que realicen la tarea, pero por ahora lo dejo desactivado.

Quizá te interese leer más sobre Wordpress Inclusivo

Una Respuesta a “WordPress Inclusivo 19: Refactorizando el código que ordena el menú admin”

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>