
🔄 WordPress en un subdirectorio: cómo mover la instalación desde la raíz y viceversa
Una situación conocida: usted configura un sitio de desarrollo, construye el tema, conecta el contenido mediante WP Migrate DB Pro y, después de publicar, descubre estilos rotos, imágenes faltantes y un wp-admin que no funciona. La razón es casi siempre la misma: producción está en la raíz mientras que desarrollo está en un subdirectorio (o viceversa), y un simple buscar-reemplazar de las URL en la base de datos no corrige esta diferencia.
El problema es más profundo de lo que parece: en una instalación en la raíz, WordPress usa el mismo dominio para todos los enlaces (tanto a páginas como a archivos multimedia). En una instalación en subdirectorio, los enlaces de contenido provienen de la dirección del sitio, mientras que los enlaces a recursos (css, js, imágenes) provienen de la dirección de WordPress. Un buscar-reemplazar estándar en toda la base de datos reemplaza todo de manera uniforme y rompe la mitad de las rutas.
En esta guía encontrará dos rutas de migración probadas (ida y vuelta) con configuraciones específicas de buscar-reemplazar, preparación del wp-config.php y la secuencia correcta de transferencia de archivos. Al terminar, usted podrá unificar los esquemas de desarrollo y producción o realizar conscientemente una migración entre diferentes tipos de instalación sin que el frontend se rompa.
💡 Resumen rápido:
- Determine su tipo de instalación: compruebe si «Dirección de WordPress» y «Dirección del sitio» coinciden en Ajustes → Generales
- Para migrar de subdirectorio a raíz: codifique WP_SITEURL en wp-config, realice un reemplazo de
/subdir→/en la base de datos, mueva los archivos un nivel arriba, actualice el index.php de la raíz - Para migrar de raíz a subdirectorio: reemplace solo las rutas a
/wp-contenten la base de datos, actualice la dirección de WordPress en los ajustes, cree el subdirectorio, copie index.php y .htaccess de vuelta a la raíz - Después de cualquier migración, vaya a Ajustes → Enlaces permanentes y haga clic en «Guardar»: esto reconstruye la estructura de URL y limpia la caché
Cómo determinar dónde está instalado WordPress
Si usted instaló WordPress manualmente, probablemente recuerde si fue en la raíz del dominio o en un subdirectorio como /wp o /blog. Pero si el sitio lo heredó de un desarrollador anterior, lo desplegó el proveedor de hosting con un clic, o han pasado varios años, los detalles se difuminan.
La forma más rápida: vaya al administrador de WordPress, abra Ajustes → Generales y observe los campos «Dirección de WordPress (URL)» y «Dirección del sitio (URL)». Si los valores coinciden, tiene una instalación en la raíz:

Si los campos difieren, WordPress está instalado en un subdirectorio (en el ejemplo siguiente, es /subdir):

Una señal adicional de una instalación en subdirectorio: al iniciar sesión en el administrador, la URL contiene un subdirectorio, por ejemplo, example.com/wp/wp-admin/ en lugar de example.com/wp-admin/.
Por qué no puede simplemente transferir de forma directa
La raíz del problema está en el sistema dual de URL que WordPress utiliza con las instalaciones en subdirectorio. Vamos a desglosarlo con ejemplos concretos.
Suponga que tiene una instalación en la raíz en example.com. Absolutamente todos los enlaces en la base de datos, tanto a una entrada /2025/about-page como a una imagen /wp-content/uploads/photo.jpg, comienzan con //example.com. Un buscar-reemplazar estándar //example.local → //example.com funciona perfectamente.
Ahora considere una instalación en el subdirectorio /wp. El enlace a la misma entrada se ve como //example.com/about-page (a través de la dirección del sitio), mientras que el enlace a la misma imagen es //example.com/wp/wp-content/uploads/photo.jpg (a través de la dirección de WordPress con el subdirectorio). Un reemplazo simple //example.local → //example.com romperá los archivos multimedia: el sistema los buscará sin /wp en la ruta y obtendrá un error 404.
La tabla siguiente muestra qué grupos de URL necesitan actualizarse en cada dirección de migración:
Dirección | URLs de página y entrada | URLs de medios y recursos | Rutas de archivo en la base de datos |
|---|---|---|---|
Subdirectorio → raíz | Reemplace | Reemplace | Reemplace |
Raíz → subdirectorio | Deje como está | Reemplace | Reemplace |
Además de la base de datos, necesita mover físicamente los archivos y actualizar el index.php en la raíz; de lo contrario, WordPress no encontrará wp-blog-header.php. A continuación, recorreremos ambas rutas paso a paso.
Método 1: mover WordPress de un subdirectorio a la raíz
Esta es la dirección más simple: usted elimina el subdirectorio de las rutas y todas las URLs quedan «planas», como en una instalación estándar.
Paso 0: diagnosticar qué va a fallar
Antes de intervenir, conviene ver el alcance del problema con sus propios ojos. La captura de pantalla siguiente muestra la configuración de migración de wp-in-a-subdirectory.local (WordPress en /subdir) a wp-standard-install.local (instalación en raíz). Los ajustes de WP Migrate DB Pro son los estándar, más un reemplazo del título del sitio a modo de demostración:

El resultado es previsiblemente desastroso: las páginas abren, pero sin estilos y con imágenes rotas:

En el HTML, puede ver enlaces a recursos con una ruta /subdir muerta que ya no existe en el servidor de destino. Intentar acceder a wp-admin provoca una redirección a wp-standard-install.local/subdir/wp-login.php, pero ese archivo no existe. Ahora solucionemos esto.
Paso 1: preparación
Primero, proteja el acceso al administrador durante la migración. Añada constantes a wp-config.php que sobrescriban los ajustes de la base de datos, para que WordPress siga permitiéndole entrar al administrador por la ruta antigua con el subdirectorio, incluso después de que limpiemos la base de datos:
1 define( 'WP_SITEURL', 'http://wp-in-a-subdirectory.local/subdir' ); 2 define( 'WP_HOME', 'http://wp-in-a-subdirectory.local' );
Luego ponga el sitio en modo mantenimiento: edite index.php en la raíz pública, comente la línea require( dirname( __FILE__ )... y después de la etiqueta de cierre ?> inserte un marcador de posición html con un breve mensaje de interrupción. Los visitantes verán esto:

Mientras tanto, usted continúa accediendo al administrador en http://wp-in-a-subdirectory.local/subdir/wp-admin/ porque la constante WP_SITEURL funciona.
Paso 2: buscar y reemplazar en la base de datos
Ahora limpie la base de datos. Ejecute una búsqueda y reemplazo con estos pares (se muestran en la interfaz de WP Migrate DB Pro, pero el mismo principio funciona con search-replace de WP-CLI o consultas SQL mediante phpMyAdmin):
//wp-in-a-subdirectory.local/subdir→//wp-in-a-subdirectory.local/app/public/subdir→/app/public(ruta del archivo en el servidor)

Inmediatamente después de la migración, la apariencia no cambiará (la página de mantenimiento sigue activa, el administrador funciona mediante la constante fija). Pero si revisa el contenido de las entradas, verá que las imágenes aún no cargan y que los enlaces internos han «perdido» el subdirectorio, que es exactamente lo que buscábamos en esta etapa:

Paso 3: transferencia física de archivos
Elimine (o comente) las líneas con WP_SITEURL y WP_HOME de wp-config.php. El administrador dejará de funcionar, así que mueva inmediatamente los archivos del subdirectorio un nivel hacia arriba.
Por SSH o línea de comandos en el servidor, esto se hace con tres comandos:
1 rm index.php && mv subdir/* . && rm -rf subdir
Por FTP o con el gestor de archivos del hosting, arrastre todo el contenido del subdirectorio a la raíz pública, reemplazando index.php:

Listo. El sitio abre en la URL raíz; las imágenes y los estilos están en su lugar:

Toque final: vaya al administrador (ahora en http://wp-in-a-subdirectory.local/wp-admin sin el subdirectorio), abra Ajustes → Enlaces permanentes y haga clic en «Guardar cambios», incluso si no modificó nada. WordPress reconstruirá la estructura de URL y limpiará la caché.
Método 2: mover WordPress de la raíz a un subdirectorio
Muchos desarrolladores consideran instalar WordPress en un subdirectorio una buena práctica: los archivos del núcleo no saturan la raíz, la gestión mediante Git/Composer se simplifica y el dominio en sí puede usarse para otras aplicaciones. Pero migrar un sitio existente a un subdirectorio es objetivamente más complejo que lo contrario, porque ahora algunos enlaces DEBEN conservar el subdirectorio y otros no.
Paso 0: diagnóstico
Mismo punto de partida: intentamos una migración estándar desde la instalación en la raíz wp-standard-install.local a la instalación en subdirectorio wp-in-a-subdirectory.local (WordPress en /subdir):

El resultado es completamente esperado: las páginas abren, pero los estilos y las imágenes se rompen porque no se añadió /subdir a sus rutas:

A diferencia del primer escenario, los enlaces a entradas y páginas funcionan correctamente (no deben contener el subdirectorio). Lo que se rompe son específicamente los recursos (css, js, medios), cuyas rutas ahora deben incluir /subdir.
Paso 1: preparación
En esta etapa, NO definimos las constantes WP_SITEURL y WP_HOME, porque nuestra búsqueda y reemplazo no tocará esos valores, y actualizaremos la dirección de WordPress manualmente un poco más tarde.
Configure la página de mantenimiento de la misma manera: comente require(...) en index.php y añada un marcador de posición html. Los visitantes ven el mensaje de mantenimiento mientras usted continúa accediendo al administrador en http://wp-standard-install.local/wp-admin/.
Paso 2: búsqueda y reemplazo selectivo en la base de datos
La diferencia clave respecto al primer método: reemplazamos SOLO las rutas de archivos y recursos, SIN tocar las URL de las páginas. Para ello, dirija el reemplazo usando el patrón /wp-content:
//wp-standard-install.local/wp-content→//wp-standard-install.local/subdir/wp-content/app/public→/app/public/subdir(ruta en el servidor)

Tras la migración, verifique el contenido de las entradas: los enlaces a otras páginas del sitio NO contienen el subdirectorio (correcto), mientras que las imágenes incrustadas sí lo contienen (también correcto):

Paso 3: actualizar la dirección de WordPress y mover los archivos
Ahora vaya a Ajustes → Generales y añada el subdirectorio al final de «Dirección de WordPress (URL)», por ejemplo, http://wp-standard-install.local/subdir. Inmediatamente después de guardar, el administrador se romperá porque WordPress intentará encontrar los archivos en la nueva ruta, pero aún no están allí:

Cree el subdirectorio subdir en la raíz pública y mueva TODOS los archivos de WordPress a él. Luego copie index.php y .htaccess DE VUELTA a la raíz para que la página de mantenimiento siga mostrándose mientras terminamos:

Restaure index.php DENTRO del subdirectorio a su estado original: elimine el marcador de posición html y descomente la línea require:
1 <?php 2 define( 'WP_USE_THEMES', true ); 3 require( dirname( __FILE__ ) . '/wp-blog-header.php' );
Ahora el administrador vuelve a ser accesible en http://wp-standard-install.local/subdir/wp-admin/:

Revise el contenido: las imágenes están en su lugar, los estilos cargan correctamente:

Toque final: index.php raíz
Solo queda actualizar el index.php en la raíz pública. Elimine la página de mantenimiento y especifique la ruta correcta hacia wp-blog-header.php teniendo en cuenta el subdirectorio:
1 <?php 2 define( 'WP_USE_THEMES', true ); 3 require( dirname( __FILE__ ) . '/subdir/wp-blog-header.php' );
El sitio se abre en la URL raíz con todos los recursos cargados desde el subdirectorio:

De nuevo, vaya a Ajustes → Enlaces permanentes y guarde sin cambios para que WordPress refresque la estructura de URL.
Herramientas alternativas y el método oficial
El enfoque descrito arriba con WP Migrate DB Pro es conveniente, pero no es la única opción. Estas son otras herramientas con las que puede trabajar:
*WP-CLI
search-replace.* El comandowp search-replace '//oldsite.local/subdir' '//newsite.com'con la bandera--dry-runle mostrará primero cuántas ocurrencias se reemplazarán. Para un reemplazo selectivo (raíz → subdirectorio), acote el patrón:wp search-replace '//newsite.com/wp-content' '//newsite.com/subdir/wp-content'.Método oficial de WordPress. La documentación en developer.wordpress.org describe el procedimiento «Giving WordPress Its Own Directory», con configuraciones detalladas para Apache (.htaccess), nginx (bloque de servidor) e IIS (web.config). El método no requiere plugins y funciona en cualquier hosting.
SQL manual. Si el volumen de ediciones es pequeño, puede ejecutar
UPDATE wp_posts SET post_content = REPLACE(post_content, '/subdir/', '/')directamente en phpMyAdmin, pero siempre con una copia de seguridad previa, ya que dicho reemplazo destruirá los datos serializados en wp_options y wp_postmeta.
Sea cual sea la herramienta que elija, la regla es la misma: al migrar de RAÍZ → SUBDIRECTORIO, reemplace solo /wp-content y las rutas de archivos; al migrar de SUBDIRECTORIO → RAÍZ, reemplace todo lo que haga referencia al subdirectorio.
⁉️🤔 Preguntas frecuentes
¿Es obligatorio WP Migrate DB Pro para este tipo de migración?
No. WP Migrate DB Pro simplemente ofrece una interfaz cómoda para buscar y reemplazar comprendiendo los datos serializados de PHP. Técnicamente, puede realizar los mismos reemplazos mediante WP-CLI (el comando
wp search-replacetambién maneja correctamente las cadenas serializadas) o usar el método oficial de WordPress con transferencia manual de archivos y edición del index.php. El plugin ahorra tiempo en proyectos medianos y grandes con muchas ocurrencias.
¿Qué debo hacer si algunas imágenes siguen sin cargar después de la migración?
La causa más común: quedan en la base de datos URL fijas con rutas absolutas del servidor antiguo que no coincidieron con el patrón de reemplazo. Revise el contenido de las entradas mediante phpMyAdmin:
SELECT ID, post_content FROM wp_posts WHERE post_content LIKE '%/subdir/%'(o el dominio antiguo). El segundo candidato es la caché del navegador y del CDN: vacíe ambas y compruebe en modo incógnito.
¿Necesito actualizar el.htaccess después de la transferencia?
Si utiliza enlaces permanentes bonitos, sí, pero WordPress lo hace automáticamente cuando hace clic en «Guardar» en la página de Ajustes → Enlaces permanentes. Si el servidor no tiene permisos de escritura, WordPress le mostrará el contenido del.htaccess listo para que lo copie manualmente. Al migrar a un subdirectorio, asegúrese de que el.htaccess raíz (no el que está dentro del subdirectorio) no contenga reglas que entren en conflicto con la nueva estructura.
¿Es posible realizar la migración con cero tiempo de inactividad?
Técnicamente sí, si utiliza el método con redirecciones.htaccess (Método I de la documentación oficial de WordPress, «Without changing URLs»). Con este enfoque, los archivos se mueven al subdirectorio mientras el.htaccess raíz dirige todas las solicitudes sin interrupción a la nueva ubicación. Los visitantes no notan el traslado. La desventaja: permanece en el mismo dominio y la URL del sitio formalmente no cambia (el subdirectorio no es visible en la barra de direcciones).
¿Por qué WP Migrate DB Pro no soporta de fábrica la migración entre diferentes tipos de instalación?
Los desarrolladores de Delicious Brains discutieron esto en GitHub durante casi tres años. La raíz del problema: el plugin aplica UN par de búsqueda y reemplazo a TODA la base de datos, pero la migración entre raíz y subdirectorio requiere reemplazos DIFERENTES para distintos grupos de URL (páginas frente a recursos). Determinar automáticamente a qué grupo pertenece cada URL requeriría analizar la estructura del contenido, lo cual va más allá de una simple búsqueda y reemplazo. Por lo tanto, la recomendación actual es: lleve los sitios a un esquema de instalación unificado ANTES de la migración.

Conclusión: ¿raíz o subdirectorio?
La elección entre instalar WordPress en la raíz o en un subdirectorio se reduce esencialmente a una sola disyuntiva. La instalación en la raíz es más simple: menos piezas móviles, compatibilidad directa entre desarrollo y producción, sin sorpresas con URL duplicadas. La instalación en subdirectorio es arquitectónicamente más limpia: los archivos del núcleo quedan aislados, solo el index.php permanece en la raíz, actualizar WordPress mediante Git/Composer es más fácil y alojar múltiples aplicaciones en un mismo dominio resulta más seguro.
Si usted tiene un sitio de producción y uno de desarrollo, unifique ambos bajo el mismo esquema (cualquiera de los dos) y olvídese del problema. Si trabaja en un equipo donde algunos proyectos están históricamente en la raíz mientras que otros están en subdirectorios, ahora conoce los patrones exactos de búsqueda y reemplazo para cada dirección.
La regla principal que vale la pena guardar: al migrar de RAÍZ → SUBDIRECTORIO, modifique solo /wp-content y las rutas de archivos; al migrar de SUBDIRECTORIO → RAÍZ, reemplace todo lo que contenga el subdirectorio. Y siempre, siempre haga clic en «Guardar» en Enlaces permanentes después de la migración.



