Uno de los grandes aprendizajes que he podido aplicar al desarrollo de sitios con WordPress, y del cual soy particularmente entusiasta de sermonear es la necesidad de mantener una versión local de desarrollo lo más parecida posible a lo que vas a utilizar en producción, lo que además se apoya y soporta un montón de otras buenas prácticas como evitar el cowboy coding, utilizar control de versiones, etc.
Puesto que para el cliente no se trata de uno de los objetivos del proyecto, la capacidad de importar una base de datos para tener una réplica de desarrollo debe ser algo sencillo y rápido de ejecutar. Aunque existen múltiples plugins y herramientas para hacerlo, para mí la forma más sencilla es recurrir a herramientas muy básicas a través de la línea de comandos.
Exportar la base de datos
Para generar la exportación de la base de datos prefiero utilizar la herramienta mysqldump, que probablemente debiese venir incluída al instalar MySQL.
Puedes utilizar el siguiente comando para generar un “dump” que es más amigable con un sistema de control de versiones (aunque esto quizás no sea la mejor de las ideas) y más rápido de importar:
mysqldump --skip-extended-insert --no-autocommit --single-transaction base_de_datos > respaldo.sql
Si necesitas bajar ese respaldo desde una red remota, puedes hacer la exportación y compresión en un solo paso con:
mysqldump --skip-extended-insert --no-autocommit --single-transaction base_de_datos | gzip > respaldo.sql.gz
Con esto, la velocidad con que se genera el respaldo es notablemente superior a lo que podrías esperar de phpMyAdmin o plugins de WordPress.
Reemplazar las referencias de URL
En un sitio de WordPress, la URL principal de tu sitio va a estar en un montón de partes, por ejemplo enlaces entre posts, ítems de menús de navegación, configuraciones de plugins… pero fundamentalmente también va a estar en dos campos de la base de datos que son los que determinan la URL de tu sitio: las opciones siteurl
y home
de la tabla de opciones.
Para poder hacer funcionar el sitio de forma local vas a necesitar como mínimo modificar esas dos opciones, aunque para hacerlo del modo más rápido puedes cambiar todas las veces que aparece la URL online por un dominio de desarrollo, lo que puedes hacer con:
sed 's/www.foobar.net/www.foobar.dev/g' -i respaldo.sql
Donde:
www.foobar.net
es la URL del sitio onlinewww.foobar.dev
es la URL que usas en desarrollo localrespaldo.sql
es el dump de base de datos (descomprimido)
Este comando va a reemplazar todas las URLs en el mismo archivo. En OSX esto tiene una sintaxis algo distinta, pero también puedes optar por la versión:
sed 's/www.foobar.net/www.foobar.dev/g' respaldo.sql > local.sql
Aquí es necesario hacer varias precisiones: idealmente, el dominio de producción y el de desarrollo local deben tener la misma cantidad de caracteres, ya que de otro modo toda la información almacenada en datos serializados se corromperá y aparecerá vacía. Esto es: configuraciones complejas de plugins, configuraciones de widgets, opciones del tema, metadatos serializados de posts o usuarios.
Como se puede ver es una limitante que sería considerable… si no fuera porque puedes amoldar tu entorno de desarrollo para evitar problemas con esto.
Importar la base de datos
Ya en el paso final, sólo queda importar la base de datos. Si has guardado las credenciales de acceso a MySQL en tu directorio de usuario, esto es tan sencillo como:
mysql base_de_datos < respaldo.sql
En caso contrario, necesitarás utilizar más opciones, como:
mysql -uUSUARIO -p base_de_datos < respaldo.sql
De modo que se utilice el usuario de base de datos especificado y te pregunte la contraseña (lo que también es mejor si no puedes asegurar el acceso a tu directorio de usuario).
Nuevamente, acá la velocidad de importación es notablemente superior a lo que puedes conseguir con phpMyAdmin u otras herramientas, ya que estarás importando los datos en “línea directa” al servidor de base de datos.
Además, tienes la ventaja de que (normalmente) no tendrás problemas de límite de peso del archivo que quieres importar — acá nuevamente hay algunos temas pendientes en OSX, dependiendo de cómo hayas instalado MySQL, pero incluso en ese caso podrás importar grandes bases de datos.
(No) sincronizar archivos de uploads/
Para finalizar, para tener una réplica completa podrías sincronizar los archivos de la carpeta uploads
con rsync
, que es una herramienta muy potente y útil… pero también puedes tener resultados tan fiables pero sin bajar decenas de GB configurando tu servidor web como proxy inverso.