Arreglar cambio de URL en Wordpress Multisite

Cambiar la URL primaria en WordPress Multisite

La URL primaria en WordPress Multisite o network es la que nos da acceso para acceder a la red de WordPress y que nos permite gestionar varios blogs a la vez en una misma instalación (en vez de instalar varias veces el motor de WordPress en subdirectorios).

Es un problema muy habitual realizar un cambio de dominio y/o ubicación de una instalación WordPress sin haber cambiado previamente la URL primaria. En realidad -y a diferencia de una instalación normal- deberemos intervenir en el proceso. De lo contrario es cuando cuando queremos acceder a la nueva dirección y nos encontramos con que el sitio ha quedado inaccesible.

¡Vamos a ver como resolver el problema!

Primer punto: ¿Para quien es este tutorial?

Puede que seas un técnico que intuye por donde van los tiros y quiere una guía rápida para solucionar el problema en poco tiempo, saltar a otro tema y preservar un poco de su salud mental, o puede que seas un usuario final intentando gestionar tu propio sitio web y te hayas encontrado con este problema.

Si eres el técnico probablemente ya sepas buena parte de todo esto, pero para hacer la entrada un poco más completa, daré cuatro pinceladas antes de entrar en materia, yo trabajo así 😉

En cualquier caso, este tutorial puede ayudarte a arreglar problemas diversos pero comunes en la instalación de un sitio WordPress, particularmente en migraciones entre servidores, así que puede que encuentres aquí algunos aspectos clave que te ayuden en tu odisea.

Caso habitual

Sin embargo y dado que cada caso particular puede requerir pasos adicionales o no requerir algunos de los indicados en esta entrada, en el contexto de esta entrada se asume que…

  • Se está trabajando con una instalación de WordPress Multisitio (Network)
  • No se ha cambiado la ubicación física (todo pasa en el mismo servidor/directorio)
  • La URL de acceso al dominio primario (del que cuelga toda la red WP) sí ha cambiado

Esto es básicamente para no intentar cubrir todos los casos posibles dado que se alejaría de la finalidad del post, que es principalmente entender qué sucede cuando cambiamos la URL del dominio privado y como actualizarla, particularmente en la base de datos.

¿De donde sale esta casuística?

Supongamos que adquirimos un nombre de dominio nuevo y pasamos de ejemplo.com a minuevamarca.com, por un tema de rebranding o lo que sea.

Queremos hacer que apunte a nuestro WordPress que ya está funcionando y uno de los pasos es ir al panel de control de nuestro registar con el que hemos contratado el dominio y actualizar las DNS del nameserver para que apunten al servidor donde tenemos el blog/sitio corporativo.

El caso es que ahora tenemos minuevamarca.com apuntando a la IP de nuestro servidor (hosting compartido, o lo que sea que tengas) pero cuando accedemos a través del navegador, WordPress no carga. Esto es porque WordPress requiere, a nivel interno, indicarle que el dominio principal ha cambiado para que todo vuelva al orden.

De hecho, en WordPress funcionando como instalación única (lo más habitual) lo ideal es hacer esto previamente desde el dominio anterior a través del panel de gestión en Ajustes > Generales de manera que para cuando hagas el cambio de dominio, ya esté listo para funcionar.

Ajustes Generales URL WordPress
Caso habitual en un sitio wordpress en modo clásico (no red o Network/Multisite). En WordPress Multisite no existe esta opción y hay que editar manualmente el fichero wp-config.php

Pero si estás aquí es porque seguramente gestionas más de un blog y pensaste que tener una instalación multisitio era ideal para no tener que hacer una instalación independiente de WordPress cada vez que creas un blog. Y de hecho lo es. Pero como contrapartida, en el caso de necesitar realizar la migracion de toda la red de blogs o querer cambiar el dominio principal, no resulta tan trivial.

Y aquí es donde intenta aportar luz esta entrada 😉

Aclarando conceptos

WordPress se compone de un conjunto de ficheros PHP/HTML/CSS/JS que conforman el esqueleto del framework del CMS (funcionalidad + presentación de la información en el navegador) y una base de datos, que contiene toda la información propiamente dicha, tanto de las entradas del blog y/o páginas corporativas, imágenes, etc. como metadatos (información sobre el propio funcionamiento interno del sitio).

Hay que tocar un poco de ambas partes para que vuelva a funcionar correctamente cuando realizamos el cambio de dominio primario.

Los ficheros

Por lo que respecta a los ficheros, hay uno que es particularmente crítico para la configuración, el fichero wp-config.php que contiene, entre otros aspectos de la configuración, la URL del sitio. Se encuentra colgando de la raíz del directorio que albergue nuestra instalación de wordpress (habitualmente es /public_html).

En una instalación WordPress normal estas dos líneas de texto son las que nos afectarían:

define( 'WP_HOME', 'http://ejemplo.com' );
define( 'WP_SITEURL', 'http://ejemplo.com' );

En una instalación Multisitio, como es el caso que nos ocupa, cambia ligeramente, encontramos lo siguiente:

define( 'WP_ALLOW_MULTISITE', true );
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'multisitio.ejemplo.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

Nota: En este caso de ejemplo tenemos un subdominio como valor de la variable DOMAIN_CURRENT_SITE porque no es el sitio principal del dominio (hay otra web instalada en el directorio raíz) y por lo tanto se instaló en su propio directorio (/wordpress) y se le asignó un subdominio, pero en tu caso podría ser perfectamente algo también tipo ejemplo.com.

De hecho, si vamos a Ajustes > Configuración de red, veremos que en vez de tener la opción de cambiar la URL del sitio como en la primera imagen, tenemos unas instrucciones para realizar el cambio manualmente.

Cambiar URL primaria en wordpress multisite
Instrucciones para cambiar la URL primaria en WordPress Multisite

El punto 2. de la imagen anterior tiene que ver con las reglas que WordPress escribirá en el fichero .htaccess para llevar a cabo las redirecciones necesarias y no entraremos en este punto por las condiciones puestas al principio de la entrada, partimos de la base que todo funcionaba bien hasta cambiar la URL, por lo tanto esto ya debería estar configurado correctamente.

Vamos a ver el punto 1. Como ya estarás intuyendo, el primer paso es editar el fichero wp-config.php de donde salen esos valores y cambiar el valor de la variable por el nuevo dominio, algo así:

...
define('DOMAIN_CURRENT_SITE', 'minuevamarca.com');
...

A diferencia de la casilla de configuración en el backend de WordPress, en el fichero se omite el protocolo de conexión (no ponemos la parte de HTTP, ni una barra al final /).

Esta es la parte más fácil. Lo complicado está en la base de datos.

La base de datos

Hay diversas tablas de la base de datos de WP que guardan una referencia a la URL del dominio primario. Para que apunten al nuevo dominio será necesario realizar una sustitución de la dirección antigua por la nueva, tal y como hicimos con el fichero de configuración.

El problema naturalmente está en que realizar esto en la base de datos es algo más complejo. Además, la base de datos de un multisitio es mas compleja ya que cada “subweb” de la red tiene un conjunto de tablas propio que van precedidas por el ID del sitio en particular.

En realidad, hay varias maneras de abordar el tema, en este caso vamos a utilizar phpMyAdmin (al que deberías poder acceder a través del panel de control de tu proveedor) y un script especial, para un tema que en breve veremos. Pero la idea general es que deberemos pasar (de una manera u otra) por todas las tablas en búsqueda de la antigua URL y sustituirla por la nueva.

La siguiente captura del panel de phpMyAdmin señala algunas de las tablas críticas para este proceso. Notar que existe un prefijo en el nombre de las tablas que suele ser al azar para cada instalación (se puede desactivar), en este caso wp_jnxm con lo que por ejemplo wp_site equivale a wp_jnmx_site en mi caso.

tablas phpMyAdmin WordPress

Podríamos Examinar cada una de las tablas y editar los valores, lanzar unas querys o consultas SQL para intentar automatizarlo (ver artículo en inglés) o descargar un backup de la base de datos, hacer un buscar y reemplazar con nuestro editor de textos favorito (por ejemplo Notepad++ o Sublime, que está de moda) e importarla de nuevo. Pero esto presenta un problema.

Datos serializados

Para entender qué son los datos serializados y por qué se usan en WordPress, casi que recomendaría leer este artículo como intro rápida.

El caso es que, por simplicidad, y a veces también por cuestiones de rendimiento, los desarrolladores de plugins de WordPress escogen serializar datos en algunas de las tablas para lo cual se requiere pasar por las funciones de serialización y deserialización de objetos PHP para recuperar sus valores, esto es, no podemos modificarlas vía querys o con el buscar reemplazar.

Por lo tanto, si editamos las tablas principales pero omitimos el resto de datos serializados, en caso de que existan, recuperaríamos el acceso al backend, por ejemplo, pero podríamos encontrarnos con widgets o plugins sin funcionar, mostrando datos corruptos, etc.

Por suerte hay gente buena en el mundo que ha puesto soluciones al alcance de todos. Una de ellas es el script Search and Replace for WordPress Databases de Interconnect/IT que vamos a usar aquí. Este script se encarga de actualizar todas las tablas sin comprometer los datos serializados, de manera que una vez terminado y si todo va bien, toda la base de datos estará actualizada con la nueva URL para que no perdamos ningún dato de plugin, widget, etc.

Script de Interconnect/IT para actualizar la BD

Deberemos descargar el script de la URL anterior, subirlo a nuestro hosting, descomprimirlo en una carpeta que cuelgue del directorio donde se encuentre nuestro wordpress (importante) para posteriormente acceder a la URL del script PHP a través del navegador.

Podemos hacerlo via FTP y descomprimir el .zip por línea de comandos si tienes acceso a SSH (developer) o, lo más sencillo seguramente (usuario), usar la utilidad para explorar ficheros de cPanel o similar de que dispongas, y descomprimirlo desde ahí.

Nota
Si eras el ‘perfil usuario’ y empiezas a ver que esto se te escapa de las manos, puedes ponerte en contacto conmigo para ver disponibildad para contratarme como servicio técnico para resolverte el problema.

En mi caso, a través del FTP, queda una estructura de ficheros así. Fijarse que he renombrado la carpeta del script para que el nombre sea algo más corto (SRDB) y que es “hermana” de las carpetas propias de WP, esto es, cuelga de la raíz de la instalación de wordpress que nos interesa:

Interconnect/IT scriptAhora solo tenemos que abrir el navegador y llamar al script con la URL/carpeta, en este ejemplo http://minuevamarca.com/SRDB (al estar el fichero .htaccess configurado previamente para WordPress seguramente el URL Rewrite funciona para ejecutar el script index.php por defecto pero sino, pon la URL completa, ej: http://minuevamarca.com/SRDB/index.php

Interconnect/IT script

Rellenamos los campos ‘replace’ con la URL vieja y ‘with’ (con) la URL nueva, manteniendo el protocolo HTTP:// (o HTTPS según convenga). Los campos nombre de la base de datos, usuario, password y host/puerto deberían rellenarse a partir del fichero wp-config.php si está funcionando correctamente.

Esa recomendable primero ejecutar la opción ‘dry run’ que hará una prueba sin efectuar cambios. Deberíamos ver cambios en algunas de las tablas (como se indica marcado en la imagen en la columna ‘Cells changed’). El script no informa de que ha terminado, pero en general lo sabremos porque dejan de aparecer más tablas durante un rato razonable.

Si consideramos que todo está funcionando bien y el programa ha detectado cambios en algunas de las tablas, solo queda … uhm, espera.

Importante
Siempre que se hacen cambios en la base de datos es altamente recomendable hacer una copia de seguridad previa, pues un pequeño error puede dejar inservible todo el sistema.

Ok, dicho esto (típico del 99.9% de entradas de este tipo) prcedemos a ejecutar el script pulsando el botón ‘live run‘ y esperamos a que termine.

Extras

Con esto, teóricamente, todos los valores de la base de datos que hagan referencia al dominio principal deberían estar actualizados, pero no parece ser siempre así, o por lo menos hay casos en los que quedan valores por actualizar.

En cualquier caso, podemos probar a recargar la web; la sección de administración es más útil en este sentido para dilucidar errores:

Error URL en base de datos WordPress

En la parte borrada aparecen respectivamente el nombre del nuevo dominio y la base de datos a la que está intentando conectar (que son correctos) pero no ha podido establecer la conexión por algún motivo, y la parte señalada en rojo afortunadamente nos da la pista.

Volvemos a phpMyAdmin y en este caso procederemos a revisar si se actualizó el valor que aparece en la table indicada, y vemos que no:

Arreglar-URL-Base-Datos-Wordpress-phpMyAdmin

El sitio con identificador 1 suele ser el sitio principal, siendo los demás (en este caso hay 3) sitios finales que hemos creado a partir de nuestra infraestructura de WordPress en red.

Por lo tanto en el 1 deberíamos reconocer el dominio anterior y pulsar Editar y reemplazarlo por el nuevo y si, en los demás, no se hubiera hecho un mapeado hacia otro dominio (por lo tanto pueden ser dominios o subcarpetas de nuestro dominio anterior) pues también tocará reemplazarlos.

Recargamos la URL del sitio principal y es probable que nos aparezca un nuevo error para alguna otra tabla crítica, como wp_site.

Repetiríamos el proceso y después de revisar las tablas necesarias, ahora ya deberíamos tener acceso de nuevo al sitio.

Es posible que wordpress detecte que ha habido cambios y requiera que reconfiguréis la red. Seguid instrucciones, y ya debería estar todo listo.

Wordpress Multisitio arreglar URL acceso

Haz algunas pruebas con los sitios hospedados en la red para verificar que cargan correctamente yse puede acceder a sus correspondientes panel de administración.

 

 

Deja un comentario