En este artículo vamos a ver paso a paso cómo realizar correctamente una migración de WordPress, tanto de hosting como de dominio de forma manual. Cuando migramos WordPress de dominio hay que tener mucho cuidado al cambiar la url en base de datos porque podemos perder información.
Como siempre, lo voy a explicar sobre un ejemplo. En este caso imaginemos que tenemos nuestra web en WordPress en www.dominioantiguo.com alojada en hosting1, y vamos a migrar a www.dominionuevo.com alojada en hosting2.
PASO 1
Contando que no tengas el desarrollo en un control de versiones… Accede por FTP a hosting1 y descarga todos los archivos del sitio a tu PC. Asegúrate de que tengas visibles los archivos ocultos en tu cliente de FTP, ¡no queremos olvidarnos del .htaccess!
Si tienes acceso por ssh, puedes comprimir todos los archivos de tu instalación desde la consola y después descargártelo:
tar -cvzf miweb.tar.gz carpeta_raiz/*
PASO 2
Accede al panel de control de hosting1, localiza el acceso a tu phpMyAdmin y exporta la base de datos. En este punto es importante recalcar que ahora mismo tenemos en nuestro PC en local tanto la base de datos como los archivos, es decir, tenemos una copia de seguridad de nuestro sitio por si algo va mal.
Por consola sería así:
mysqldump –u nombreusuario –p nombrebbdd > basededatos.sql
Si tuvieras acceso por WP-CLI, podrías exportar la base de datos con el siguiente comando
wp db export basededatos.sql
PASO 3
Accede por FTP a hosting2 y sube todos los archivos de tu sitio o el tar.gz en caso de que lo hicieras por consola. Para este supuesto, descomprímelo con el siguiente comando:
tar -xzvf archivo.tar.gz
PASO 4
Accede al phpMyAdmin de hosting2 e importa la base de datos. Si lo haces por consola:
mysql –u nombreusuario –p nombrebbdd < basededatos.sql
Si tuvieras instalado por WP-CLI el comando sería:
wp db create
wp db import basededatos.sql
PASO 5
Edita el archivo wp-config.php de hosting2 y comprueba y modifica en caso necesario los datos de conexión a la base de datos del nuevo alojamiento.
Hasta aquí serviría esta guía si sólo cambias WordPress de alojamiento. Si además estás migrando de dominio sigue al paso 6.
PASO 6
Éste paso es crítico en cualquier migración de WordPress, sobretodo si estás cambiando de dominio. Veo en muchos tutoriales que aconsejan reemplazar la URL directamente en base de datos a través de unas sentencias UPDATE a las tablas options, posts y postmeta, y esto es INCORRECTO.
O que aconsejan hacerlo en los ajustes generales, y NO DEBE HACERSE así. Si alguna vez lo has hecho probablemente hayas perdido configuraciones, ajustes, widgets, etc…
Muchos plugins y temas generan nuevas tablas en base de datos, y en estas tablas pueden almacenarse datos que contengan la URL del dominio antiguo. Además, muchos plugins y temas serializan la información en base de datos, y esto es más grave ya que perderíamos todos estos datos.
Serializar la información es algo MUY común, y que utilizan MUCHOS plugins, incluso el propio WordPress serializa información en la tabla postmeta por ejemplo. Me explico:
Imaginad que tenemos un plugin que guarda enlaces relacionados de tus post en un array y lo serializa:
// Ejemplo de array de datos:
$array_datos = array(
"url" => "http://www.dominioantiguo.com/post1/",
"target" => "_blank",
"order" => "1"
);
//Array serializado:
a:3:{s:3:"url";s:36:"http://www.dominioantiguo.com/post1/";s:6:"target";s:6:"_blank";s:5:"order";s:1:"1";}
Cuando se serializa la información, se obtiene una cadena donde se representa el dato y la longitud de este. En este caso a:3 hace referencia a un array de 3 elementos, englobado entre llaves. Dentro de estas llaves observamos s:3:»url», que hace referencia a que la longitud de url es de tres caracteres; s:36:»http://www.dominioantiguo.com/post1/» quiere decir que http://www.dominioantiguo.com/post1/ tiene 36 caracteres, y así sucesivamente…
¿Qué pasaría si hacemos el reemplazo manual de http://www.dominioantiguo.com/post1/ por http://www.dominionuevo.com/post1/? Pues que la longitud de http://www.dominionuevo.com/post1/ es de 34, por lo tanto a la hora de unserializar este dato, no va a coincidir con lo que debería, y nunca se va a recuperar esta información, por lo tanto los datos almacenados que usan algunos plugins se perderán y dejarán de funcionar cosas.
¿Cuál es la solución? De hecho en el propio codex de WordPress hablan de esta situación y te aconsejan tres opciones:
- Usar los plugins Better Search Replace o Velvet Blues Update URLs si tienes acceso al back-end de la web.
- Usar WP-CLI’s search-replace si tu proveedor de hosting lo tiene.
- Usar Search and Replace for WordPress Databases Script, un script para realizar este cambio de URLs en base de datos.
Yo recomiendo siempre la opción de WP-CLI, es la más rápida y cómoda. Bastaría con acceder por ssh y ejecutar el siguiente comando:
wp search-replace 'www.dominioantiguo.com' 'www.dominionuevo.com' --all-tables
Si no tienes acceso por WP-CLI, y quieres tener un control manual de la migración, te recomiendo entonces utilizar el script de migración. Lo subiremos por FTP, lo ejecutamos desde el navegador y seguimos los pasos para cambiar la URL.
Reemplazaremos la cadena www.dominioantiguo.com por www.dominionuevo.com. Y el script se encargará de buscar en todas las tablas, incluidas las posibles tablas que puedan haber añadido algunos plugins, y si encuentra información serializada, la tendrá en cuenta y reemplazará también el valor de la longitud de la nueva cadena, de este modo no perderemos nada.
También es aconsejable hacer después una búsqueda y reemplazo de dominioantiguo.com por dominionuevo.com, ya que puede haber enlaces sin www.
Aún tenemos que buscar dos posibles patrones de elementos que pueden variar al migrar de dominio y/o servidor. El primer elemento son los correos electrónicos. Es aconsejable buscar y reemplazar @dominioantiguo.com por @dominionuevo.com, ya que podemos tener direcciones de e-mail con el dominio antiguo y querer cambiarlas por el nuevo.
También podría darse el caso de que tengamos en base de datos almacenado como ruta el path de nuestro servidor, por ejemplo: /var/usuario/web/public_html/… Si no cambiamos de servidor no hará falta buscar y reemplazar éste tipo de cadenas, pero si nuestra migración implica cambio de hosting, probablemente el nuevo tenga una ruta diferente, por lo tanto habrá que buscar en BBDD si tenemos alguna ruta del tipo «/home» ó «/var» haciendo referencia al path de tu hosting antiguo.
NOTA
Agradezco a Jose Conti su aporte relativo a éste último punto sobre la posibilidad de tener en base de datos rutas haciendo referencia al path del servidor.
Con esto ya hemos terminado la migración de WordPress tanto de hosting como de dominio. Este ejemplo es perfectamente válido si lo que quieres hacer es migrar WordPress desde tu local a producción. Todo debería funcionar correctamente, en caso de que algo haya ido mal, recuerda que tienes copia de seguridad completa en tu ordenador.
Por último, borra el script de migración, bien usando el botón delete me, bien desde el FTP, ya que de lo contrario si alguien accediera a él por la URL podría causarte un destrozo.