Memoria de una mudanza

Mi nombre es Nicolás Fantino, ala_747 es mi alter ego en el mundo ya nada virtual de los ceros y unos y 100px es el espacio binario que perpetro con más cariño. Se supone que sé hacer algunas cosas más o menos bien. Tengo una relación bastante alegre con WordPress desde que era b2 (aunque no tuve un blog, o algo parecido, hasta mayo de este año). Cuando Mariano me pidió que, finalmente, lo ayudara con la mudanza de Denken Ãœber, hasta entonces gestionado con Movable Type, a WordPress no lo podía creer. Tanto tiempo machacandolo para que se decidiera y cuando ya había desistido, viene y me sorprende así... mortal :)

No es mi primera mudanza de MT a WP. Quizás alguien haya leído en su momento la memoria de la mudanza de Minid. De aquel momento a ahora ha pasado mucha agua bajo el puente. WordPress ha crecido mucho y lo sigue haciendo, sus desarrolladores y la comunidad que lo utiliza no paran de agregar funciones nuevas y de mejorar las existentes, y ésto nos hace la vida más facil para este tipo de cuestiones. Al igual que en la mudanza de Diego, me comprometí a escribir una explicación lo más detallada posible del proceso que seguimos, esperando que pueda ayudar a alguien que se encuentre pensando en hacer lo que hicimos aquí.

Como muchos sabrán, hay varias formas de mudar un blog de un sistema de publicación a otro. Con la debacle de MT hubo muchos sitios que decidieron pasarse a otros gestores, entre ellos WP. Muchos de esos sistemas no son tan flexibles como WP para ciertas cosas y por lo tanto obligaron a los autores a hacer un "borrón y cuenta nueva" con sus sitios (sea recomenzando su blog desde cero; o importando los posts, categorías y comentarios pero perdiendo las URI antiguas). Cuando hablamos de sitios muy grandes y frecuentados, como Denken Ãœber o Minid, creo que no pueden permitirse "el lujo" de perder las URI antiguas ya que no solo están indexadas en todos los buscadores (cosa que se puede lograr esperando a que cada buscador indexe el sitio nuevamente), sino que además muchos posts están enlazados desde otros muchos sitios y los autores de esos sitios pueden no saber que tienen enlaces rotos en sus escritos. Además, existe una regla básica a la hora de hacer "buena web" la cual dice que las URI no se cambian, deben ser permanentes para que la gente pueda agendarlas y consultarlas independientemente del tiempo que pase (ya que se dá por supuesto que tuvo sus motivos para agendarlas).

Ahora bien, mudar un blog de este calibre cuidando los detalles e intentando que el resultado "se vea" lo más parecido posible a lo que había antes requiere un pequeño estudio y una planificación previa. Es una ecuación muy simple: cuanto más estudio y planificación, menos problemas o imprevistos sobre la marcha. Siempre se debe tratar de ir de lo general a lo particular para que los posibles imprevistos nos aparezcan en la cabeza (o el papel) antes de que pasen realmente.

Lo primero que decidimos es que queremos cambiar de MT a WP, por lo tanto debemos conocer lo más detalladamente posible ambos sistemas, sus posibilidades, sus limitaciones, sus trucos. El siguiente paso es analizar en detalle lo que se tiene online. Anotar cosas como el formato de las URI (de los posts, de los archivos, etc.), la codificación de caracteres, el tipo o los tipos de archivos que se ofrecen, las diferencias entre páginas (la página principal no es igual que la de un post particular, o que la home de una categoría, o que los resultados de una búsqueda).

Con todo bajado al papel recién podemos ponernos a pensar en el sistema nuevo. Debemos asegurarnos qué cosas podremos replicar (y cómo las replicaremos) y cuáles no.

A partir de aquí será conveniente hacer una instalación del sistema nuevo para hacer pruebas paralelamente al sitio de producción (personalmente, siempre intento usar el hosting del sitio de producción para asegurarme el mismo entorno que tendrá nuestro nuevo pequeño cuando pase a suplir al viejo). Para este caso decidí probar una versión "alfa" del futuro WP 1.3. ¿Una "alfa"? ¿No será peligroso? Bien, es posible, pero no lo creo. Dos meses atrás no lo hubiese hecho porque las "alfas" que había estaban muy verdes y hacían agua por todos lados (aunque ya hubiera osados que las ponían en producción -A Proletarium Blog, por ejemplo- y las sacaban adelante como si nada pasara, loable ;)). Pero finalmente, ¿por qué una "alfa"? Ok, el secreto estaba en el formato de los permalinks. Mariano usaba un formato del tipo "/archivos/categoría/post.php" y, como muchos sabrán, la versión 1.2 de WordPress no soporta categorías en los formatos. Este detalle hizo que la mudanza de Minid fuera bastante más complicada que la de Mariano ya que tuve que modificar bastante el sistema original y, por ende, actualizar el sistema de Diego no será tan facil como el de Mariano. Otro secreto es el nuevo sistema de "Themes" que taerá WP 1.3. Denken Ãœber tiene distintos formatos para mostrar los datos dependiendo de dónde estemos. La página principal no es igual que una página de categoría, o de un post particular, o del resultado de una búsqueda. Si bien he explicado en mi sitio cómo lograr ésto bastante facilmente en WP 1.2 hay que admitir que es bastante más complicado que el sistema nuevo que permite crear templates (plantillas) separadas para cada sección del sitio y que, ademas, admite una serie de funciones que ayudan a la detección de la sección en la que nos encontramos para el uso de condicionales if-else. Para leer más sobre el funcionamiento de "Themes" (en inglés) o sobre las funciones "is_" para condicionales (en inglés).

Bien, con el nuevo sistema instalado podemos exportar la base de datos de MT y seguir "las instrucciones del fabricante" para importarla en WP. El primer paso "real" está dado. A parir de aquí todo será "cuesta abajo" (si todo va bien). Lo siguiente será definir el formato de permalinks y probar que todo funcione. Con el formato de Mariano no he tenido que mover líneas del .htaccess porque WP tome las URI del admin como posts o categorías pero puede suceder, así que a no desesperar y a aprender lo básico de Expresiones Regulares para entender qué lógica siguen las reglas del mod_rewrite que nos da WP y a modificar lo que haga falta (sé que suena o parece dificil, pero no lo es), a veces basta con subir una línea a arriba de todo para que todo funcione.

Viendo que todo funciona correctamente podremos dedicarnos a cambiar el template "default" por el nuestro. Lo que hice con el site de Mariano fue copiar el HTML de cada tipo de página y reemplazar los textos que estaban por las etiquetas que pondrían esos textos sacándolos de la base de datos. Otra forma de hacerlo sería buscar equivalentes entre las etiquetas de MT y las de WP, pero como no estoy demasiado familiarizado con las de MT, preferí el primer sistema. Mientras hacía ésto, y por pura "deformación profesional", no pude evitar fijarme en la estructura del XHTML de las páginas; así me dí cuenta que con 4 gráficos y arreglando un poquito los anchos de algunos contenedores en el CSS se podía lograr un bonito rediseño casi sin esfuerzo. No le pregunté nada a Mariano, lo hice (me llevó unos 15 minutos) y lo puse en el sevidor de pruebas y le pedí que entrara a ver como iba "la cosa". Se sorprendió bastante y, por suerte, le encantó (de hecho, hasta me "mintió" que era justo lo que tenía en mente) y no hubo que tocar nada más.

A esta altura, ya teníamos un "doble" de Denken Ãœber funcionando a pleno pero gestionado con WordPress. A continuación, los últimos detalles. La lista de los últimos posts de Mobile, una funcioncita para mostrar los últimos posts comentados y otra para presentar los Archivos Anuales y el sitio estuvo listo para largar.

Para poner el nuevo sitio online también había un par de posibilidades. La primera era mover el sitio de desarrollo al de producción, aún con el MT funcionando, limpiar la base de datos del WP, volver a exportar el MT, importarlo en el nuevo sitio y "apagar" el viejo. ¿Pros? ¿Contras? Bueno, básicamente este sistema tiene un solo "pro", permite un "downtime cero"; o sea, "Hola, soy MT, ahora me ves... ahora ya no me ves porque soy WP, ¿te diste cuenta de algo? ;)", pero tiene una contra: todo comentario ingresado al MT mientras se hace el backup, se descarga el backup a la maquina, se vuelve a subir al server, se importa al WP y se pone el WP online, deberá ser ingresado "a mano" por el dueño del sitio luego. En este sitio consideré que todo el proceso llevaría unos 15 minutos (bien planeado, bien ejecutado y sin contratiempos como cortes de línea o de FTP). La segunda opción era hacer todo lo anterior pero previo "bajar" el MT, no permitiendo así ni comentarios, ni trackbacks, ni pingbacks que ingresar a mano luego. Siendo el estimado de 15 minutos, consideré mejor esta última opción y así le ahorré un posible trabajo extra a Mariano (quien ya nos ha hablado de su "comodidad" :P).

Resumiendo el final... el "downtime real" fue de entre 15 y 20 minutos durante los cuales quien haya entrado se habrá encontrado con muchos errores 404. El tiempo total de trabajo real fue de unas 4 horas y la alegría de leerlo a Mariano diciendome que "al final WP no estaba tan mal" fue mucha.

Ahora bien, no todo son rosas en estos caminos. Muchos habrán visto que durante unas 2 horas justo después del cambio el servidor devolvía un espantoso error 500. Ésto se debió a que yo no sabía que este nuevo WP viene con algo nuevo: si el .htaccess tiene permisos de escritura, al entrar en la página de gestión de los permalinks ésta actualiza automáticamente el .htaccess. Cuando terminamos, yp tuve que salir un par de horas de casa y Mariano se dió una vuelta por el admin y pasó por esa página. Ésta reescribió las reglas en el .htaccess con tan mala suerte que una línea se juntó con otra anterior que habíamos agregado a mano (para redireccionar los feeds viejos a los nuevos) y la sintaxis se fue al cuerno y eso solo significa una cosa, Apache colgado, ¿solución facil? no dejar el .htaccess con permisos de escritura.

Otra cosa digna de mencionar es algo que nos está estaba pasando con Bloglines. Los feeds ya no están realmente donde estaban antes por lo que agregamos un par de reglas para que el mod_rewrite redireccionara las URI de los feeds viejos a los nuevos (cosa totalmente normal y que ya he hecho muchas veces, inclusive en 100px). Bloglines se resiste resistía a aceptar que los feeds todavía existen existían, lo más raro es que es el único. Todos los programas y sistemas sindicadores que hemos probado funcionan, Bloglines no lo hacía. Por si alguien tiene una idea de lo que pueda estar pasando, hemos redireccionado con los siguientes comandos:

RewriteRule ^index.xml$ /index.php?feed=rss2 [QSA]
RewriteRule ^index.xml$ /index.php?feed=rss2 [QSA,L]
RewriteRule ^index.xml$ /index.php?feed=rss2 [r=301]
Redirect Permanent /index.xml https://www.uberbin.net/feed/rss2/

Nada ha funcionado con Bloglines, y todas han funcionado con todos los demás. Si alguien sabe de qué va la cosa, aquí escuchamos :) Usando la última opción y luego de más de 12 horas, Bloglines ha vuelto a leer los feeds (opción A: era un problema nuestro y se ha arreglado con la última regla; opción B: Bloglines agregó idiomas y rompió el lector de feeds de Uberbin :P).

Una última cosa que se nos escapó y que nos dió un susto ayer mismo. MT seguía funcionando, aunque "escondido". Ayer, alguien llegó por casualidad a un post del MT y puso un comentario y automáticamente MT nos pisó el index.php (por eso más de uno vió durante un rato el sitio "viejo"). Simplemente se subió nuevamente el index.php del WP y todo se arregló, obviamente MT ha sido jubilado completamente para que no vuelvan a pasar más cosas como esa.

Bueno, bit más o bit menos, ésta es la historia de esta mudanza y así se la contamos, esperando que pueda ser útil (al menos para saber lo que no hay que hacer).

Agradezco a Mariano por la confianza ciega (muy ciega e inconsciente :P) que ha depositado en mí y en mis criterios para la realización de este trabajo. Ha sido para mi una gran responsabilidad y he disfrutado realmente mucho haciéndolo, como todos los trabajos que me presentan algún desafío (de los que ando escaso últimamente, dicho sea de paso). Y agradezco el espacio que me brinda para contar la experiencia.

Gracias.

| Open Source Weblogs