Tras la WordCamp Sevilla 2011

Como ya sabéis muchos de vosotros este fin de semana he estado en la WordCamp Sevilla 2011. Las WordCamp son los eventos oficiales de WordPress en los que suele ir gente de Automattic, la empresa que hay detrás de este grandísimo software, además de usuarios y desarrolladores de la plataforma.

Durante el fin de semana estuve dando un par de charlas, una sobre Google Panda y WordPress, en la que comenté como reducir la cantidad de URL que genera WordPress perdiendo el mínimo tráfico posible, y sabiendo que en la nueva versión el propio sistema, a sabiendas de esto, va a incorporar mejoras de forma automática para que no afecte negativamente. La otra charla, de un nivel técnico más elevado, trató sobre WordPress Performance Optimization, comentando dos temas principales: la infraestructura para montar algo que soporte cientos de miles de visitas diarias y otra parte con plugins (y más sencillo de implementar) que ayuden a mejorar el rendimiento y la seguridad de la plataforma.

El evento fue durante dos días (sábado y domingo) el primer día dedicado más a aquellos que utilizan la plataforma y el segundo a los que administran o desarrollan sobre la plataforma. ¿Cosas que he aprendido? Pues el tema de los Child Themes, algo bastante sencillo que se aplicó hace poco, pero, como me he dedicado más desde WordPress 3 al rendimiento que al desarrollo de temas se me había pasado. A parte de eso, la seguridad, ataques y demás que cada vez hay más, mantener pocos plugins y bien testeados y que todo lo que se desarrolle sea internacionalizable.

Una de las cosas que comenté en mi presentación fue sobre la desaparición de MyISAM en las futuras versiones de MySQL, concretamente (por las últimas noticias que tengo) a partir de la versión 5.6 ya sólo vendrá INNOdb, algo que considero muy razonable, ya que las bases de datos deben ser relacionales. Esto implica un cambio de paradigma en WordPress donde las tablas no están relacionadas. Como experiencia personal, INNOdb aún no soporta FullTEXT (parece que la siguiente versión lo hará) por lo que se puede migrar de MyISAM a INNOdb teniendo en cuenta esta pérdida. Este sitio ya tiene aplicado este tipo de base de datos y lo cierto es que mejora ciertamente el rendimiento y al estar relacionada evita ciertas cagadas a la hora de eliminar contenidos.

Como último detalle para futuras WordCamp en España propondría a los organizadores tener alguna sala para hacer talleres de 2-3 horas, muy en plan práctico. Me parece genial meter charlas de media hora que son muy dinámicas pero, creo, que eso evita poder enseñar muchas cosas con código interesantes para que la gente pueda aplicarlo. Hacer un taller de 3 horas (montar un WordPress desde cero y configurarlo, plugins esenciales y configuración, escalar WordPress, creación de Child Themes…) podría estar bien para aquellos que tiene un nivel muy muy bajo o muy muy alto de la plataforma, aunque fuera pagando un extra de algunos euros para subvencionar los ponentes (que no es lo mismo dar una charla de media hora que hacer unos talleres).

Algunos ya sabréis que a finales de noviembre está previsto que se organice una WordCamp en Madrid, así que, si no falla nada, por allí nos veremos.

WordPressformance Optimization #WordCampSev 2011

Ayer ya di la charla de Google Panda y WordPress y hoy ha tocado la charla de WordPress Performance Optimization, que he reducido a WordPressformance.

La charla de hoy ha tratado de cómo montar una infraestructura más organizada en sitio que necesitan alto rendimiento, ya que está claro que montar un WordPress en la misma máquina el Apache, SQL y PHP pues como que no es lo mejor…

Así que nada, aquí os dejo la presentación en PDF para los que queráis descargarla.

WordPress y Google Panda #WordCampSev 2011

Entre hoy y mañana se está celebrando el WordCamp Sevilla 2011 y voy a dar 2 charlas… la primera de ellas se llama WordPress y Google Panda y, como ya podéis supones habla de la relación que hay entre el nuevo algoritmo Google Panda y WordPress (.org).

Os dejo la presentación descargable en PDF.

Como comentario a destacar (que he de analizar en una versión de pruebas que tengo) es que me han comentado que WordPress 3.3 incluirá grandes mejoras en cuanto a qué indexa y que no indexan los buscadores en determinadas URL de WordPress. Habrá que verlo y en base a eso analizar hacia dónde va el SEO de WordPress.

WordCamp Sevilla 2011

Hace más de 6 años que utilizo WordPress… concretamente desde la versión 1.5 cuando lancé OJObuscador allá por mediados de junio de 2005. Había utilizado muchos CMS, pero desde aquel momento todos los proyectos que he tenido que lanzar (sin contar los de desarrollo propio) han sido lanzados con WordPress.

Ahora que WordCamp vuelve a España he creído conveniente devolver un par de trucos a la comunidad… además ambos van relacionado con temas que me gustan, como son el WPO y el SEO, por lo que todo perfecto. Los próximos 8 y 9 de Octubre estaré por Sevilla.

Las charlas son las siguientes:

  • WordPress y Google Panda: La idea es comentar algunas cosas que WordPress no acaba de hacer correctamente y que a Google no les gusta, pero con un plugin y unos pequeños cambios se puede arreglar de forma simple. Será el Sábado 8.
  • WordPressformance Optimization: He creído divertido este concepto, en el que básicamente explicaré una infraestructura y configuración de servidores que permite que WordPress pueda soportar cientos de miles de visitas diarias sin parpadear. Será el Domingo 9.

Como siempre, todo lo que explicaré estará descargable (supongo que en esta entrada o en otra, además de en la propia web del WordCamp Sevilla 2011) y, si no me equivoco, grabarán en vídeo las presentaciones, por lo que podréis ver más adelante lo que explico delante de vuestro ordenador. Además han abierto un canal de twitter @WordCampSev desde el que puedes seguir todo lo relacionado con el mismo.

Si alguien tiene alguna consulta o sugerencia que quiere que comente y me la quiere decir antes de ir al evento, que lo haga y lo intento meter en las presentaciones (aunque ya las tengo casi acabadas). Y recordad que sólo vale 15 euros y que si tienes pasta podrías estirarte y patrocinar el evento, o colaborar aportando material.

El plugin SEO perfecto para WordPress

Hace un tiempo que comenté que algún día publicaría cómo debería ser el plugin perfecto de SEO para WordPress. Que conste que esto es una carta a los Reyes Magos, y que personalmente limitaría al máximo las opciones que puedan configurar los usuarios, dando una serie de opciones predeterminadas para que realmente la aplicación sea óptima. Comencemos.

El primer punto vamos a enfocarlo a los títulos. Por norma general los títulos de un sitio se pueden configurar de forma bastante automática siguiendo las bases de cómo busca la gente. Aunque hay 2 opciones: un sitio organizado principalmente por páginas o por entradas. Si el sitio está organizado por entradas (en modo blog, vaya) la estructura de URL debería ser:

  • Página Principal: Nombre del blog (sin palabras clave ni nada)
  • Título de las entradas: El título propiamente dicho, sin necesidad de añadir el título del blog, la categoría o similares.
  • Título de las páginas: A mi me gusta hacer la combinación “Título en Nombre del sitio“. Digamos que es la forma más estándar que podríamos aplicar sin que queden cosas muy extrañas.
  • Otras cosas: Pues similar a la de las “páginas”. Hay que tener en cuenta que muchas de estas no se indexarán.

Si el sitio está organizado por páginas tal vez valga la pena cambiar y que las páginas en sí sólo lleven el título, sin necesidad de ir acompañado del nombre del sitio.

Con respecto al meta-description, creo que la forma más sencilla es la de incorporar el “extracto” y si no existiera poner los 160 primeros caracteres de la propia entrada o página. Para acabar, el meta-keywords, aunque no tenga mucha importancia, si se configura correctamente sí que sirve. En este caso yo añadiría la combinación de categoría y etiquetas.

Un detalle importante es qué indexar y qué no. Aquí también daría un par de opciones a parte de dejar algo genérico. Lo opcional sería indexar sólo categorías o etiquetas. Personalmente no me gusta que se indexen las etiquetas ya que se generan muchos contenidos duplicados. Otra opción sería que, en aquellas etiquetas en las que haya menos de 3 entradas aparezca un “noindex” de forma automática, dejando indexar siempre las categorías y sólo aquellas etiquetas con más de 3 contenidos.

Lo que sí que quedaría prohibido indexar es el archivo, es decir, el día, mes, año, paginación -todo aquello que en la URL acabe generando un /page/- y los adjuntos, que suelen ser imágenes y generan páginas “sin valor”.

Además de hacer estas cosas debería incluir un sistema que genere los sitemaps. Aunque ya existen varios plugins suelen ser muy complejos de configurar y se puede reducir al máximo su configuración. En este caso volvemos a lo de siempre, si la página está basada “en entradas o en páginas”. En el caso de que sea por entradas, sólo deberían aparecer aproximadamente las entradas publicadas en los últimos 15 días. Con eso es más que suficiente para que el buscador sepa de la existencia de las mismas. En el caso de las páginas, se podrían incluir todas. Eso sí, es imprescindible que el sistema haga “ping” a Bing y Google (y Yandex, aunque no sé ahora mismo si Yandex tiene la opción de enviar el Sitemap vía ping).

Un siguiente paso sería el de “minificar” los CSS y JavaScript. Personalmente me gusta lo que hace el WP Minify sobre todo si se configura en modo “friendly URL” que queda una URL bastante decente (aunque lleve un MD5). De esta misma forma, también añadiría un sistema que, cuando se suba una fotografía se haga automáticamente un Smush.it (también sé que hay un plugin que lo hace, pero debería venir de serie).

Debemos tener en cuenta es el uso del PubSubHubbub, y auqnue hay varios sitios donde hacer ping, al final el que siempre funciona es el propio de Google y al que tienen acceso prácticamente todos los servicios que lo necesiten.

Se debería automatizar es la inclusión de las meta-etiquetas del OpenGraph. Aunque principalmente es utilizado por Facebook, sin duda es un sistema que puede ayudar de forma automática a otras páginas que lo utilicen.

Un sistema automático que detecte, ya no sólo el uso del con-WWW y sin-WWW, que en principio WordPress ya lo hace, sino que directamente lo haga con todo el dominio… en alguna ocasión me he encontrado varios dominios apuntando a uno, y WordPress no ha sido capaz de redirigirlo, por lo que habría que incorporarlo para que funcione de forma automática.

Con respecto a los contenidos duplicados habría que tener en cuenta el uso de la meta-etiqueta del canonical y dejar como opcional la indexación del buscador o no. Por suerte o desgracia el buscador se puede añadir a cualquiera de las URL del sitio y suele funcionar, lo que genera una cantidad infinita de direcciones URL que no se deben contemplar. Yo reduciría el sistema a que sólo pueda existir el “/s?=busqueda” sin paginaciones y sin otras combinaciones…

Las páginas de error se deberían reducir. WordPress suele detectar bastante bien las páginas que no encuentra o que la URL se parece a una que ya tiene, pero sigue siendo pobre… quizá habría que plantear que cuando se genera un error 404 se haga una búsqueda más profunda ya no tan sólo en la URL sino en el título o en contenidos que tengan la mayoría de esas palabras de la URL. En caso contrario, más que devolver un 404 yo devolvería un 410 para que eso no se vuelva a indexar.

Seguro que me dejo cosas, pero creo que sería un buen primer paso tener automatizado al máximo estos puntos en una única herramienta. Quedarían cosas como por ejemplo el tema de las cachés, que como siempre digo la propia del WordPress me parece genial, pero dejando que los buscadores por ejemplo también indexen las cachés y que la caché dure 24 horas y no 1 como va por defecto… pero bueno, ahí ya hay trabajo… y si a alguien se le ocurren más cosas, que lo comenten, por si alguien se anima y lo desarrolla.

WordPress Performance Análisis

WordPress es un gran CMS, no me cansaré de decirlo, ya que lo uso desde 2006 y la verdad es que pocos problemas me ha dado; pero cada vez más las configuraciones e instalaciones se complican, los sitios web crecen de tráfico y la configuración básica ya no es suficiente.

En las últimas semanas he hablado de algunos desastres con WordPress, de la creación de estáticos para WordPress, algunos trucos con el .htaccess… y hoy quiero comentar un par de plugins que creo que son bastante interesantes de cara a tener en cuenta pequeñas mejoras de rendimiento.

El primero más que para analizar el rendimiento es para aumentarlo. Hoy en día por defecto WordPress viene configurado para que se cree un histórico de todas las entradas, actualizaciones y demás de forma infinita, por lo que se pueden generar hasta decenas de copias de una entrada antes de ser publicada. la verdad es que si activas el auto-guardado (por ejemplo cada 2 minutos -120 segundos-) creo que es más que suficiente y pocos necesitamos tener el historial. Para ello lo mejor es configurar esto en el wp-config.php:

define('WP_POST_REVISIONS', false);
define('AUTOSAVE_INTERVAL',120);

Una vez tengamos esto configurado deberíamos hacer una pequeña limpieza de la base de datos para aligerarla un poco (o mucho) con el plugin Better Delete Revision que aliviará un poco las consultas.

Pero no quería hablar de esto, sino de analizar las consultas a la base de datos. Y es que estos días atrás, como ya comenté en la entrada de los desastres de WordPress, me he encontrado con una instalación que me ha traído de cabeza algunas semanas. Durante un día completo desactivamos plugins, cambiamos la plantilla (aunque los responsables de la web la volvían a activar, de ahí el no haber encontrado el error)… total, que hace unos días me instalé un interesante plugin llamado Debug Queries que básicamente lo que hace es añadir al pie de página la lista de todas las consultas a la base de datos. En una plantilla sencilla (por ejemplo la Twenty Eleven) se hacen entre 20 y 40 consultas aproximadamente (dependiendo en muchos casos de los plugins instalados). El sitio que estaba monitorizando tenía más de 1800 consultas en todas las páginas. Al final, hice la misma prueba con el diseño por defecto y me volvió a dar las 30 habituales, manteniendo todos los plugins activos. Esto me hizo pensar que el fallo estaba en la plantilla, y que debía ser algo que estaba en todas las páginas (así que se reducía todo a que probablemente fuera la cabecera, el pie o la barra lateral).

Analizando la cabecera me di cuenta de que se hacían muchas consultas a cosas que siempre van a devolver los mismos resultados, como son las direcciones URL de las plantillas, del propio sitio web, etc… lo puse a pelo y me quedé tan ancho; lo mismo hice con el pie de página. Pero esto no era y la desesperación aumentaba. En la barra lateral había muchas zonas de código HTML comentados, y ahí estaba el error, que casi por inercia obviaba esas zonas “que no se ejecutan”… pero no me fijaba en el código PHP de ellas. Sí, allí estaba.

El sitio es colaborativo y tiene abierto el registro para cualquier usuario, a los que ofrecen sistemas de puntuaciones por participar, entre otras cosas. Pues allí estaba la función wp_list_authors listando los 900 y pico de usuarios en un menú desplegable que, en la web, no se veía. Como tenemos un sistema de reducción de código con WP Minify el sistema elimina toda la parte “comentada” del HTML, así que aunque miraba y miraba en el código fuente no se veía absolutamente nada extraño. Y es que aunque hay 900 usuarios, por cada uno de ellos se ejecutan dos consultas, una que pide la información de la tabla usuarios (ID por ID) y luego la que solicita todos los metadatos de dicho usuario… en definitiva: 900 por 2 te dan las 1.800 consultas que se estaban ejecutando y que no servían para absolutamente nada.

Lo más curioso de todo es que la propia página de código de WordPress incluye una sección llamada Testing WordPress Performance en la que da algunas explicaciones sobre cómo controlar el rendimiento del propio sistema en la que básicamente se trata el tema de Xdebug para controlar el PHP y de MySQLnd para analizar el MySQL.

Llevo años optimizando WordPress, pero siempre hay algún sitio web que no deja de sorprenderme.

Funciones interesantes para WordPress (3)

Y una nueva entrega de la serie de entradas sobre funciones interesantes para WordPress y más funciones interesantes para WordPress.

Eliminar palabras de menos de 3 letras en la URL al crearse:

function remove_short_words($slug) {
  if (!is_admin()) return $slug;
  $slug = explode('-', $slug);
  foreach ($slug as $k => $word) {
    if (strlen($word) < 3) {
      unset($slug[$k]);
    }
  }
  return implode('-', $slug);
}
add_filter('sanitize_title', 'remove_short_words');

Mostrar un bloque con la URL corta de cada entrada en su panel:

function shortlink_add_column($cols) {
  $cols['shortlink'] = 'Enlace Corto';
  return $cols;
}
function shortlink_add_value($column_name, $post_id) {
  if ('shortlink' == $column_name) {
    echo '<input type="text" value="'.wp_get_shortlink($post_id).'" onclick="this.focus(); this.select();">';
  }
}
function shortlink_sortable_column($columns) {
  $columns['shortlink'] = 'Enlace Corto';
  return $columns;
}
add_filter('manage_edit-post_sortable_columns', 'shortlink_sortable_column');
add_filter('manage_posts_columns', 'shortlink_add_column');
add_action('manage_posts_custom_column', 'shortlink_add_value', 10, 2);

Los usuarios (no admin) sólo pueden ver su librería multimedia:

function my_files_only($wp_query) {
  if(strpos($_SERVER['REQUEST_URI'], '/wp-admin/upload.php') !== false) {
    if(!current_user_can('level_5')) {
      global $current_user;
      $wp_query->set('author', $current_user->id);
    }
  }
}
add_filter('parse_query', 'my_files_only');

Los usuarios (no admin) sólo pueden ver sus entradas:

function posts_for_current_author($query) {
  global $pagenow;
  if('edit.php' != $pagenow || !$query->is_admin)
    return $query;
  if(!current_user_can('manage_options')) {
    global $user_ID;
    $query->set('author', $user_ID);
  }
  return $query;
}
add_filter('pre_get_posts', 'posts_for_current_author');

Ver más botones en el Tinymce HTML:

function fb_change_mce_options($initArray) {
  $ext = 'pre[id|name|class|style],iframe[align|longdesc|name|width|height|frameborder|scrolling|marginheight|marginwidth|src]';
  if(isset($initArray['extended_valid_elements'])) {
    $initArray['extended_valid_elements'] .= ','.$ext;
  } else {
    $initArray['extended_valid_elements'] = $ext;
  }
  return $initArray;
}
add_filter('tiny_mce_before_init', 'fb_change_mce_options');

Funciones interesantes para WordPress (2)

Prosigo con la serie de entradas sobre funciones interesantes para WordPress.

Añadir ancho y alto en el listado de contenidos multimedia:

function tamany_column($cols) {
  $cols["dimensions"] = "Dim (Wid × Hei)";
  return $cols;
}
function tamany_value($column_name, $id) {
  $meta = wp_get_attachment_metadata($id);
  if(isset($meta['width']))
    echo $meta['width'].' × '.$meta['height'];
}
add_filter('manage_media_columns', 'tamany_column');
add_action('manage_media_custom_column', 'tamany_value', 10, 2);

Limitar la subida de ficheros a GIF, JPG y PNG:

function restrict_mime($mimes) {
  $mimes = array(
    'gif' => 'image/gif',
    'jpg|jpeg|jpe' => 'image/jpeg',
    'png' => 'image/png'
  );
  return $mimes;
}
add_filter('upload_mimes', 'restrict_mime');

Habilitar Tinymce HTML sólo para algunos usuarios:

function disable_html_editor_wps() {
  global $current_user;
  get_currentuserinfo();
  $users = array("admin", "juan", "maria");
  if(!in_array($current_user->user_login, $users)) {
    echo '%MINIFYHTML280bdc71655f37fcd6e51804efe2bc4d2%';
  }
}
add_filter('wp_default_editor', create_function('', 'return "tinymce";'));
add_action('admin_head', 'disable_html_editor_wps');

Crea un meta-description con el texto del contenido:

function create_meta_description() {
  global $post;
  if(!is_single()) { return; }
  $meta = strip_tags($post->post_content);
  $meta = strip_shortcodes($post->post_content);
  $meta = str_replace(array("\n", "\r", "\t"), ' ', $meta);
  $meta = substr($meta, 0, 160);
  echo '<meta name="description" content="'.$meta.'">';
}
add_action('wp_head', 'create_meta_description');

Cambia la cantidad de elementos por página en el panel de administración:

function admin_pagination() {
  global $wp_query;
  $per_page = 50;
  $wp_query->query('showposts='.$per_page);
}
add_action('admin_head', 'admin_pagination');

Funciones interesantes para WordPress (1)

Voy a comenzar una serie de entradas que tratan sobre WordPress. Como ya sabréis, WordPress permite tener en la carpeta del “theme” un fichero llamado functions.php en el que se pueden incluir una serie de funciones que se pueden ejecutar en cualquier lugar del diseño, o pueden ser funciones que sobre escriban, eliminen o amplíen algunas de las funciones que ya vienen en el sistema. No es muy recomendable pasarse poniendo funcione (ya que aumentarán las necesidades de recursos de la máquina) pero sí que es interesante tener en cuenta algunas de estas:

Añadir tu propio CSS en wp_nav_menu:

function custom_nav_class($classes, $item) {
  $classes[] = "custom-class";
  return $classes;
}
add_filter('nav_menu_css_class' , 'custom_nav_class' , 10 , 2);

Eliminar la versión de WordPress del RSS/Atom:

function remove_feed_generator() {
  return '';
}
add_filter('the_generator', 'remove_feed_generator');

Añadir un campo para Twitter y Facebook en la ficha del usuario, y mostrarlo en el listado de usuarios:

function add_contactmethods($contactmethods) {
  $contactmethods['twitter'] = 'twitter';
  $contactmethods['facebook'] = 'facebook';
  return $contactmethods;
}
add_filter('user_contactmethods','add_contactmethods',10,1);
function profile_links($actions, $user_object) {
  $actions['website'] = '<a href="'.$user_object->user_url.'">web</a>';
  $actions['facebook'] = '<a href="'.$user_object->facebook.'">fb</a>';
  $actions['twitter'] = '<a href="'.$user_object->twitter.'">tw</a>';
  return $actions;
}
add_filter('user_row_actions', 'profile_links', 10, 2);

Cambiar el color de las entradas en el panel de administración) según su estado:

function posts_status_color() {
?>
  <style>
  .status-draft { background: #FCE3F2 !important; }
  .status-pending { background: #87C5D6 !important; }
  .status-publish { /* por defecto */ }
  .status-future { background: #C6EBF5 !important; }
  .status-private { background: #F2D46F; }
  </style>
<?php
}
add_action('admin_footer','posts_status_color');

Enviar al resultado cuando sólo hay uno en una búsqueda:

function single_result() {
  if(is_search()) {
    global $wp_query;
    if($wp_query->post_count == 1) {
      wp_redirect(get_permalink($wp_query->posts['0']->ID ));
    }
  }
}
add_action('template_redirect', 'single_result');

Y por hoy ya está… próximamente algunos códigos más.

Desastres varios con WordPress

Creo que en las últimas semanas no me había encontrado con tan elevada cantidad de WordPress tan mal configurados. Y es que aunque WordPress es un gran sistema de gestión de contenidos (principalmente para blogs) en cuanto montas algo con cara y ojos y tienes más de 1.000 visitas al día el rendimiento del gestor de contenidos que viene por defecto (y con la configuración por defecto) es una castaña.

Estos últimos 3 meses me ha tocado documentar una base de infraestructura ideal para montar el software y, poco a poco, ir mejorándolo hasta llegar a lo que pensamos que puede ser una estructura ideal. No es fácil, ya lo digo, pero sin duda permite una escalabilidad que no habíamos podido tener.

Lo bueno de WordPress es que permite crecer de muchas maneras, y lleva elementos de serie (aunque no activados) que mejoran mucho la plataforma. Por ejemplo, la caché que lleva internamente es muy decente. Quizá la situación se complica cuando empezamos a meter plugins y otros elementos que lo complican en exceso.

Para empezar, algo tan básico como el fichero de configuración. No es suficiente con configurar la base de datos, sino que ejecutar la URL que te da las “claves aleatorias” para las cookies ya aumenta la seguridad muchísimo, porque, en caso de creer que te has dejado el ordenador con tu sesión abierta en cualquier lugar y correr peligro, tan sólo hay que regenerar estas claves para que se desloguee cualquier usuario y tenga que acceder y validar la clave si no la ha puesto. Otras cosas como cambiar el nombre del prefijo de la tabla por defecto (de wp_ a loquesea_) permitirá que ataques de inyección de SQL puedan quedar inútiles.

Aparte de cambiar el idioma define('WPLANG', 'es_ES'); también debemos activar la caché define('WP_CACHE', true); (que activará la caché interna del propio WordPress, sin necesidad de ningún plugin… aunque no es la mejor configuración, algo ayuda. Otras formas de evitar problemas es reducir las entradas históricas hasta eliminarlas define('WP_POST_REVISIONS', false); y activar un sistema que tenga autoguardado para que, mientras escribes tus entradas, se vaya guardando cada, por ejemplo, 120 segundos define('AUTOSAVE_INTERVAL',120);. Si tenéis un blog ya funcionando, podéis instalar, ejecutar, y desinstalar el plugin Better Delete Revision que os ayudará con la limpieza de basura antigua.

Ahora que ya tenemos la configuración base tocaría montar todo el sistema de estáticos para WordPress. Con esto te aseguras la velocidad de carga sin medida de las imágenes y otros elementos.

Y para acabar viene la reconfiguración de la caché. Personalmente utilizo y seguiré utilizando el wp-caché de Ricardo porque no es un plugin de caché, sino que reconfigura la caché interna del propio WordPress. En mi caso lo configuro para que cachee elementos al menos 24 horas. Una vez tenemos esto, ya lo últimos es meter una capa de Varnish por encima, con una configuración específica que nos hemos ido creando para este CMS (y que hace que, por ejemplo las cosas del panel de Administración no se cacheen, o que los comentarios no den errores…).

Para acabar, los plugins… la gente suele instalar “cualquier plugin” porque cree que está bien o hace lo que quiere, pero no todos los plugins están bien programados, y cosas que se pueden programar fácilmente (por ejemplo con códigos óptimos que hay por la red) se complican con plugins que hacen peticiones interminables a la base de datos y aumentan el tiempo de carga hasta los 2 segundos cuando deberían quedarse en menos de 1 segundo. Sin duda, cuando alguien me pide los plugins que uso o la posibilidad de añadir uno o cambiar por otro es una tarea bastante elevada que no es fácil de realizar.

Ahora, mi siguiente paso, es el de intentar eliminar las funciones deprecated y así reducir finalmente el consumo de memoria con elementos antiguos que no deberían usarse ya que existen funciones nuevas que las sustituyen…

Como decía, en estas últimas semanas me ha tocado optimizar cerca de 10 blogs (algunos de 100 visitas/día, otros de 15.000 visitas/día) con parte de estas herramientas… la velocidad de carga ha aumentado de forma exagerada y sin duda es un placer navegar por los sitios, cuando antes era algo insoportable.