WordPress es el CMS más popular del mundo y las razones son muchas: es infinitamente personalizable, la comunidad es muy activa y la cantidad de plugins es impresionante. Programar en WordPress es muy cómodo, pero uno de los problemas que siempre molestan cuando se trabaja en equipo es la sincronización de la base de datos.

Muchas veces la base de datos se ignora en la sincronización y cada quien tiene un archivo wp-config.php por separado.

Pero hay ocasiones en las que trabajar con bases de datos diferentes es muy molesto, y aunque en teoría sincronizar la base de datos en git es medio mala práctica, a veces no hay otra vuelta. Una solución es hacer un dump de la base de datos e incluirlo en el commit, pero esto se puede volver molesto, sin contar de que simplemente se te puede olvidar. Estar haciendo un dump cada vez que hagas commits es tedioso. Además, para que funcionen los links internos tenemos que hacer search and replace de la base de datos. Es cierto que podemos establecer hosts virtuales en común, pero si estamos trabajando localmente y con un servidor se pone complicada la cosa.

Existe una manera en la que podemos automatizar este proceso usando los hooks de git y wp-cli.

Cuando creamos un proyecto de git usando el comando conocido de

git init

Se crea en nuestro proyecto una carpeta oculta .git. Si vemos dentro de esta carpeta encontramos la siguiente estructura

ukT6QoX02dKx50tQtuP1+A0qLKydIUJVUdx9f96cJaZ7akUz+JJjffnEMpvN2m3LZDLhG4CFhYWF9eUQCwsLCwsLCxMLCwsLC+vhJlYACwsLCwtrNwgTCwsLCwsLEwsLCwsLCwsTCwsLCwsLEwsLCwsLC2sn6v8H3v1FtHcresQAAAAASUVORK5CYII=

De aquí nos interesa la carpeta hooks. Cuando entramos vamos a ver una lista de archivos que todos terminan en .sample

wddZly7rMocswAAAABJRU5ErkJggg==

 

 #!/bin/sh
mysqldump -u [usuario] -p[clave] --skip-extended-insert [nombre_base_datos] > /ruta/a/tu/repo/[nombre_archivo].sql
cd /ruta/a/tu/repo
git add [nombre_archivo].sql

Ahora tenemos que hacer el script ejecutable

 chmod +x /ruta/a/tu/repo/.git/hooks/pre-commit

Entonces a partir de ahora, cada vez que hagamos un commit automáticamente se hará un dump de la base de datos y se integrará a nuestro commit.

Ahora vamos a crear el post-merge que se ejecuta cada vez que hacemos un pull. Recordemos que, técnicamente, cada vez que hacemos un pull git hace un merge, no solamente cuando ejecutamos el comando git merge para unir dos branches.

Por alguna razón mi git no genera el archivo post-merge.sample, sin embargo, si se crea el archivo, funciona a la perfección.

 #!/bin/sh
mysql -u [usuario] -p[clave] [nombre_base_datos] < /ruta/a/tu/repo/[nombre_archivo].sql

Hasta aquí vamos bien, pero igual tendríamos el problema de las rutas malas en nuestra base de datos. Podemos agregar después la magia de wp-cli, si vemos la documentación podemos correr el siguiente comando:

wp search-replace [vieja_url] [nueva_url]

Nuestro archivo completo sería así

#!/bin/sh
mysql -u [usuario] -p[clave] [nombre_base_datos] < /ruta/a/tu/repo/[nombre_archivo].sql
wp search-replace [vieja_url] [nueva_url]

Sólo nos falta colocar éste como ejecutable también

chmod +x /ruta/a/tu/repo/.git/hooks/post-merge

Y estamos listos. Ahora cada vez que hagamos un commit, la base de datos se sincronizará; y cada vez que hagamos un pull, también nos traeremos los últimos cambios de ésta sin problemas.