WordPress: arreglando la tabla wp_options

Este verano tramullas.com ha funcionado «in the wild», con una mínima atención. A finales de agosto aprecié una más que notable lentitud de ejecución y respuesta. Revisando la implementación, no había nada raro… hasta que descubrí el desaguisado en la tabla wp_options.

La tabla en cuestión es, en origen, una tabla en la que almacenar parámetros de configuración, pero que los programadores de plugins han convertido un una especie de saco para un montón de cosas, la mayor parte de ellas relacionadas con información temporal sobre conexiones, cachés, datos temporales… vamos, lo  que no debería hacerse en ningún caso (esto no pasa en Drupal ;-).

Por alguna extraña razón, en la wp_options de este blog el número de registros aumentaba en varios miles diariamente (no es broma). Tras googlear y comprobar contenidos, descubrí que el problema vería dado por:

  1. Aumento discriminado de registros «transient», datos temporales que crean los plugins, pero que luego no borran adecuadamente; y
  2. Aparición por centenares de registros «displayed_galleries», creados por la última versión del plugin NextGen Gallery, en la cual han creado un código defectuoso para el widget de presentación. Anda, que siendo uno de los plugins más usados y afamados, ya les vale, ya…

Así que manos a la obra y a subsanar el problema. Realmente, la única solución es borrar los registros de la base de datos (realmente, la buena sería modificar el código de los plugins para evitarlo). El procedimiento es acceder a la base de datos, por ejemplo usando PHPMyAdmin, y ejecutar la orden SQL

DELETE FROM wp_options WHERE option_name like '_transient_%';

Esta orden borrar todos los transient (pero tranquilo, que irán aparecienco más y seguirán fastidiando…). Si además hay que reparar el destrozo de NextGen, la orden completa sería

DELETE FROM wp_options WHERE option_name like '_transient_%' OR option_name like 'displayed_galleries%';

Después de ejecutar estas órdenes, hay que optimizar la base de datos, para asegurar un funcionamiento eficiente. ¿Y si no se tiene acceso a un administrador de MySQL?, Se pueden instalar plugins que, desde dentro del propio panel de WordPress, ayudan:

  • Clean Options: revisa la tabla wp_options, identifica los registros qe no corresponden a plugins o temas activos, y los transient, ofreciendo un listado y permitiendo su borrado. Lleva dos años sin actualizaciones, aún funciona, pero falla en situaciones de miles de registros, y es lento de respuesta. Si el problema es de unos centenares, cumple bien su función.
  • Artiss Transient Cleaner: un plugin más moderno y activo que permite el borrado, y que lo lleva a cabo diariamente de forma automática.
  • WP Clean Up: borra los transiente, y también detecta y borrar «drafts», «orphan», «trash», «spam»…
  • También se puede optar por usar un plugin de gestión general de la base de datos, que permita ejecutar órdenes SQL y optimizar, como por ejemplo WP-DBManager, o limipadores de base de datos, de lo que varios permiten, entre sus opciones, borrar los transient.

Al final, lo mejor es identificar un plugin de gestión de la base de datos, que permita usar sentencias SQL, planificar tareas de backup y procesos de optimización…