Si alguna vez has instalado WordPress Multisite sabrás que lo primero que te pide es que tomes una decisión: subdominios o subdirectorios.
Por favor, elige si quieres que los sitios de tu red WordPress usen subdominios o subdirectorios. No podrás cambiar esto después.
Instalación de WordPress
La decisión es importante, y a partir de aquí debes seguir unos pasos parecidos pero diferentes en función de lo que hayas elegido.
Lo cierto es que una vez tomada la decisión es para siempre, WordPress no te permite revertir este paso. Pero como la vida da muchas vueltas quizá el día de mañana puedas encontrarte en la necesidad de cambiar de modelo y WordPress no te permite hacerlo de forma nativa.
¿Se puede hacer algo?
La respuesta es sí. De hecho en estas vueltas que da la vida que comentaba anteriormente, personalmente me ha tocado hacerlo en un par de ocasiones.
Podemos cambiar WordPress multisite de subdominios a subcarpetas y viceversa, pero requerirá unas acciones delicadas, por lo tanto es de vital importancia hacer un backup de nuestra base de datos y de los archivos wp-config.php y .htaccess, por si cometemos algún error en alguno de los pasos que comentaremos a continuación. No hagáis nunca esto en producción.
Vamos a ver cómo haríamos para cambiar de una estructura multisite de subdominios a subcarpetas, es decir, pasar de https://sitio1.midominio.com/ a https://midominio.com/sitio1/.
Primer paso
En nuestro archivo de configuración wp-config.php buscaremos la línea:
define( 'SUBDOMAIN_INSTALL', true );
y la sustituimos por la siguiente:
define( 'SUBDOMAIN_INSTALL', false );
Guarda los cambios
Segundo paso
Nos vamos al archivo .htaccess y buscamos las reglas que están entre #BEGIN WordPress y #END WordPress. Tendremos esto:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
</IfModule>
# END WordPress
y lo sustituiremos por:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
</IfModule>
# END WordPress
Guardamos los cambios
Tercer Paso
Accedemos a la base de datos y buscamos la tabla wp_blogs. Nos encontraremos algo parecido a esto:
Como nuestra intención es pasar a subcarpetas, deberemos establecer a mano todos los sitios de nuestro multisite con el dominio principal en el campo domain de la tabla wp_blogs. Y en el campo path pondremos el nombre de lo que antes era nuestro subdominio. Esta tabla quedaría de la siguiente forma:
Si tenemos pocos sitios es una labor que podemos hacer rápidamente a mano. Si tienes cientos o miles de sitios quizá te convenga desarrollarte un pequeño script para automatizar esta tarea.
Cuarto paso
Como sabrás, WordPress almacena todos sus enlaces de forma absoluta, por lo tanto es necesario hacer un reemplazo de todas las URLs de todos nuestros sitios. Para esta labor es necesario utilizar WP-CLI o el script de Search & Replace. NUNCA de manera manual o haciendo UPDATES directamente a la base de datos, porque es muy probable que tengamos información serializada que podamos perder.
Tendremos que hacer en reemplazo de URLs de esta forma para todos los sitios que tengamos en nuestro multisite.
Quinto paso
Comprobar que todo está funcionando correctamente
Viceversa, de subcarpetas a subdominios
En el caso de que queramos pasar un multisite de subcarpetas a subdominios el proceso es exactamente igual, pero a la inversa:
- Por seguridad copia de la base de datos y de los ficheros wp-config.php y .htaccess
- Definir en wp-config.php el SUBDOMAIN_INSTALL a true
- Cambiar las reglas en el .htaccess por las de subdominios. (más info aquí)
- Cambiar en todos los sitios la columna domain de la tabla wp_blogs estableciendo los subdominios de cada site. Dejaremos el campo path simplemente con la barra /
- A través del script Search & Replace ó WP-CLI reemplazaremos todas las URLs del tipo midominio.com/sitio1 por sitio1.midominio.com
- Comprobaremos que todo está funcionando correctamente