Migrar tu sitio WordPress puede parecer una tarea intimidante, pero con los conocimientos y la preparación adecuados, se convierte en un proceso perfectamente manejable. Ya sea que estés cambiando de dominio, actualizando tu proveedor de hosting o reestructurando la arquitectura de tu sitio, esta guía completa te acompañará en cada paso del proceso de migración de WordPress.
Dirección de WordPress y dirección del sitio
Antes de adentrarnos en las técnicas de migración, es fundamental entender las dos configuraciones de URL principales en WordPress:
- Dirección de WordPress (URL): Es donde residen los archivos del núcleo de WordPress
- Dirección del Sitio (URL): Es la dirección que los visitantes escriben en su navegador para llegar a tu sitio
Ambas configuraciones deben incluir la parte https:// y no deben tener una barra diagonal / al final. Estas configuraciones controlan cómo WordPress muestra las URLs a lo largo de tu sitio, incluyendo la sección de administración y el frontend.
Cuándo hay que migrar un sitio WordPress
Existen varios escenarios que pueden requerir la migración de tu sitio WordPress:
- Cambios de Dominio: Rebranding o cambio a un mejor nombre de dominio
- Migración de Hosting: Mudanza a un mejor proveedor de hosting
- Cambios de Servidor: Actualización de la infraestructura del servidor
- Reestructuración del Sitio: Mover WordPress a un subdirectorio o directorio raíz
- De Desarrollo a Producción: Paso de entorno de staging a producción
- HTTP a HTTPS: Implementación de certificados SSL
Copia de seguridad antes de migrar WordPress
Qué copiar antes de migrar WordPress
Antes de intentar cualquier migración, crea copias de seguridad completas:
- Copia de Seguridad de Base de Datos: Exporta tu base de datos WordPress vía phpMyAdmin o WP-CLI
- Copia de Seguridad de Archivos: Descarga todos los archivos y directorios de WordPress
- Copia de Seguridad de Configuración: Guarda tu archivo wp-config.php por separado
- Configuraciónes de Plugins/Temás: Documenta las configuraciones personalizadas
Cómo probar la migración en un entorno de staging
Siempre prueba las migraciones en un entorno de staging antes de ir a producción:
## Crear un subdirectorio de prueba
mkdir /var/www/html/test-site
## Copiar archivos a la ubicación de prueba
cp -r /var/www/html/wordpress/* /var/www/html/test-site/Cómo cambiar las URL de WordPress tras migrar
Método 1: WP_HOME y WP_SITEURL en wp-config.php
Para cambios temporales de URL, añade estas líneas a tu wp-config.php:
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');Ventajas: Rápido e inmediato Desventajas: Valores codificados directamente, ya no podrás editarlos en el admin de WordPress
Método 2: cambiar siteurl y home desde functions.php
Si tienes acceso FTP pero no puedes acceder al admin de WordPress:
- Accede al archivo functions.php de tu tema activo
- Añade estas líneas después de la etiqueta de apertura
<?php:
update_option('siteurl', 'https://example.com');
update_option('home', 'https://example.com');- Sube el archivo y visita tu panel de administración
- Importante: Elimina estas líneas después de que el sitio funcióne
Método 3: la constante RELOCATE en wp-config.php
WordPress incluye un método de reubicación automática:
- Edita wp-config.php y añade antes de “¡Eso es todo, deja de editar!”:
define('RELOCATE', true);- Visita
https://tusitio.com/wp-login.php - Inicia sesión normalmente
- Verifica las URLs en Ajustes > Generales
- Elimina la constante RELOCATE después
Advertencia de Seguridad: Nunca dejes la constante RELOCATE en wp-config.php ya que crea vulnerabilidades de seguridad.
Método 4: editar siteurl y home en phpMyAdmin
Para un control preciso, edita las URLs directamente en la base de datos:
- Accede a phpMyAdmin
- Selecciona tu base de datos WordPress
- Encuentra la tabla wp_options (el prefijo puede variar)
- Edita las filas ‘siteurl’ y ‘home’
- Actualiza option_value con las nuevas URLs
Crítico: ¡Siempre haz una copia de seguridad de tu base de datos antes de hacer ediciones directas!
Migración manual de WordPress a otro servidor o dominio
Cómo mover WordPress a otro servidor
Al migrar a un nuevo servidor:
- Copia de Seguridad Completa: Respaldo total del sitio y la base de datos
- Exportar Base de Datos: Usa phpMyAdmin o WP-CLI
- Transferir Archivos: Usa FTP, SFTP o rsync
- Importar Base de Datos: Crea una nueva base de datos e importa
- Actualizar wp-config.php: Modifica las credenciales de la base de datos
- Actualizar URLs: Usa uno de los métodos anteriores
- Probar Exhaustivamente: Verifica toda la funcionalidad
Cómo cambiar el dominio de WordPress con WP-CLI
El cambio de dominio requiere atención especial a los datos serializados:
## Usando WP-CLI (recomendado)
wp search-replace 'dominioviejo.com' 'dominionuevo.com' --skip-columns=guid
## O usa plugins especializados como:
## - Better Search ReplaceImportante: Nunca actualices la columna GUID en la tabla wp_posts. GUID significa Identificador Único Global y nunca debe cambiar para mantener la compatibilidad con lectores de feeds.
Migración de subdirectorio a raíz
Mover WordPress de un subdirectorio a la raíz:
- Actualizar URLs en Admin de WordPress: Ajustes > Generales
- Copiar Archivos: Mover los archivos de WordPress a la nueva ubicación
- Actualizar .htaccess: Modificar las reglas de reescritura
- Actualizar Permalinks: Volver a guardar la estructura de enlaces permanentes
- Verificar Enlaces Internos: Actualizar URLs codificadas directamente
Migración multisitio
WordPress Multisitio requiere consideraciones adicionales:
- Respaldo de la Red: Todos los sitios y bases de datos
- Editar wp-config.php: Actualizar las constantes multisitio
- Actualizar .htaccess: Modificar las reglas de reescritura multisitio
- Actualizaciones de Base de Datos: Actualizar las tablas wp_blogs y wp_site
- Opciones de Sitios Individuales: Actualizar las tablas de opciones de cada sitio
Checklist después de migrar WordPress
Qué probar justo después de migrar
- Probar la funcionalidad del frontend
- Verificar el acceso al admin
- Comprobar todos los formularios y envíos
- Probar la funcionalidad de e-commerce
- Verificar el inicio de sesión/registro de usuarios
Redirecciones 301 y sitemap tras cambiar de dominio
- Implementar redirecciones 301 desde las URLs antiguas
- Actualizar sitemap.xml
- Enviar el nuevo sitemap a los motores de búsqueda
- Actualizar la propiedad de Google Analytics
- Verificar Google Search Console
Caché, base de datos y SSL tras la migración
- Limpiar todas las cachés
- Optimizar las tablas de la base de datos
- Comprobar la compatibilidad de plugins
- Probar la velocidad del sitio
- Verificar el certificado SSL
Errores al migrar WordPress y cómo solucionarlos
Pantalla blanca de la muerte tras migrar
Generalmente causada por:
- Agotamiento del límite de memoria
- Conflictos de plugins
- Incompatibilidad de temas
Solución: Aumentar el límite de memoria en wp-config.php:
define('WP_MEMORY_LIMIT', '256M');Errores de conexión a la base de datos
Verifica los ajustes de wp-config.php:
define('DB_NAME', 'nombre_base_datos');
define('DB_USER', 'usuario');
define('DB_PASSWORD', 'contraseña');
define('DB_HOST', 'localhost');Problemas de contenido mixto
Recursos HTTP en páginas HTTPS causan advertencias de seguridad:
## Encontrar contenido mixto
grep -r "http://" wp-content/Problemas de enlaces de imágenes y medios
Actualizar URLs de medios en la base de datos:
UPDATE wp_posts SET post_content = REPLACE(post_content,'dominioviejo.com/wp-content/uploads','dominionuevo.com/wp-content/uploads');Plugins y herramientas para migrar WordPress
Plugins de migración recomendados
- All-in-One WP Migration: Herramienta completa de migración de sitios
- Duplicator: Crea paquetes de migración fácilmente
- WP Migrate Lite (antes WP Migrate DB): exportación de la base de datos con buscar y reemplazar
- Better Search Replace: buscar y reemplazar desde el escritorio, con soporte para datos serializados (Velvet Blues Update URLs está cerrado en el directorio de plugins desde el 3 de mayo de 2024)
- Migrator: copia de seguridad y migración en un solo archivo, sin límite de tamaño artificial (según las FAQ de All-in-One WP Migration, el límite de importación lo fija el tamaño de subida del hosting, no el plugin) y con reescritura de URL segura para datos serializados. Consulta la guía de copia de seguridad y migración.
Comandos WP-CLI para exportar, importar y reemplazar URL
## Exportación de base de datos con WP-CLI
wp db export backup.sql
## Importación de base de datos con WP-CLI
wp db import backup.sql
## Búsqueda y reemplazo
wp search-replace 'url-antigua' 'url-nueva' --dry-runSeguridad al migrar WordPress de hosting
- Usa HTTPS: Asegúrate de que SSL esté configurado en el nuevo servidor
- Actualiza los Permisos de Archivos: Protege wp-config.php (600) y los directorios (755)
- Elimina Scripts de Migración: Borra archivos temporales y constantes
- Actualiza las Claves de Seguridad: Genera nuevas claves de WordPress en wp-config.php
- Monitorea los Logs: Vigila actividad inusual después de la migración
Optimización del rendimiento después de la migración
Optimizar tablas con OPTIMIZE TABLE
OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_postmeta;
OPTIMIZE TABLE wp_options;Caché y CDN en el nuevo hosting
- Configura el caché de páginas
- Establece el caché del navegador
- Activa la integración con CDN
- Optimiza el caché de la base de datos
Cómo probar WordPress después de la migración
Probar menús, formularios, búsqueda y medios
- Navegación: Todos los elementos del menú funcionan correctamente
- Formularios: Los formularios de contacto y envíos funcionan
- Búsqueda: La búsqueda del sitio devuelve resultados
- Comentarios: El sistema de comentarios funciona
- Medios: Las imágenes y videos cargan correctamente
Revisar meta etiquetas, URL canónicas y schema
- Meta Tags: Los títulos y descripciones se muestran correctamente
- URLs Canónicas: Apuntan al nuevo dominio
- Datos Estructurados: El marcado schema se válida correctamente
- Enlaces Internos: Todos los enlaces funcionan y redirigen apropiadamente
Monitorizar WordPress después de la migración
Monitorizar uptime, Search Console y errores 404
- Configura el monitoreo de tiempo de actividad
- Supervisa Google Search Console para detectar errores
- Rastrea las analíticas para patrones de tráfico
- Vigila errores 404 en los logs
Mantenimiento continuo después de la mudanza
- Optimización regular de la base de datos
- Optimización y compresión de imágenes
- Monitoreo del rendimiento de plugins
- Implementación de auditoría de seguridad
Cómo migrar WordPress sin caída del servicio con el TTL de DNS
Un resolver puede guardar en caché un registro DNS durante el tiempo que permite su TTL (RFC 1035, sección 3.2.1). Eso fija el orden de los pasos:
- Baja el TTL con antelación. Pon los registros A y AAAA con un TTL corto, por ejemplo 300 segundos, al menos un TTL antiguo completo antes del cambio. Si el valor anterior era 86400 segundos, eso significa un día antes, porque hasta que caduque los resolvers siguen respondiendo con la IP antigua.
- Prueba el servidor nuevo con el archivo hosts. Asocia el dominio a la IP nueva en tu archivo hosts local y recorre el checkout, el acceso y los formularios en el servidor de destino antes de que cambie el registro público. Los visitantes siguen llegando al servidor antiguo.
- Congela las escrituras para el volcado final. Los pedidos, comentarios y envíos de formularios que lleguen al servidor antiguo después del último
wp db exportno se trasladan. Pon el sitio antiguo en modo mantenimiento, o detén la publicación, durante la exportación e importación finales.
Cómo transferir una biblioteca de medios grande con rsync
FTP vuelve a copiar cada archivo en cada intento. rsync sobre SSH compara origen y destino y envía solo las diferencias, así que una segunda pasada mueve solo lo que cambió desde la primera (manual de rsync).
- Ejecútalo dos veces. La primera pasada copia
wp-content/uploadsmientras el sitio antiguo sigue en línea. La segunda, durante la congelación de escrituras, recoge los archivos añadidos entretanto. - Reemplaza las URL con WP-CLI, no con SQL. WordPress guarda opciones y ajustes de widgets como arrays PHP serializados que registran la longitud de cada cadena.
wp search-replacereescribe esas longitudes, unREPLACE()de SQL no. - Regenera las miniaturas si cambia el tema.
wp media regeneratevuelve a crear las miniaturas para los tamaños de imagen registrados en la instalación nueva, y--only-missinglo limita a las imágenes a las que les faltan tamaños (WP-CLI: wp media regenerate).
Cómo revisar SEO, SSL y Core Web Vitals tras migrar WordPress
- Rastrea la lista de URL antiguas. Cada URL antigua debe responder con un 301 hacia su equivalente nueva, y ningún enlace interno debe devolver un 404. Google recomienda redirecciones permanentes del lado del servidor de las URL antiguas a las nuevas en un traslado de sitio, y un cambio de dirección en Search Console cuando cambia el dominio (Google Search Central: traslados de sitios con cambios de URL).
- TLS y HSTS. Instala el certificado en el servidor nuevo antes del cambio. HTTP Strict Transport Security obliga a los navegadores a usar solo HTTPS con el dominio durante todo el periodo max-age (RFC 6797), así que actívalo solo cuando HTTPS funcione en todos los subdominios que cubre.
- Mide antes y después. Pasa PageSpeed Insights por las mismas plantillas en el servidor antiguo y en el nuevo. La caché de página, OPcache, la caché de objetos y la compresión gzip o Brotli del nuevo hosting se notan en el tiempo de respuesta del servidor.
Obligaciones del RGPD al cambiar de hosting WordPress
Para el sitio de una empresa en la UE, un hosting nuevo es también un nuevo encargado del tratamiento de datos personales:
- Un contrato de encargo con el nuevo proveedor. El artículo 28 del RGPD exige un contrato que fije el objeto, la duración, la naturaleza y la finalidad del tratamiento, y que obligue al encargado a las medidas de seguridad del artículo 32 (RGPD, Reglamento (UE) 2016/679).
- Actualiza la política de privacidad. Si el traslado añade una CDN, una nueva ubicación de copias de seguridad o un nuevo hosting, la lista de destinatarios de la política de privacidad cambia con él.
- Supresión en el proveedor antiguo. Según el artículo 28, apartado 3, letra g, el encargado suprime o devuelve los datos personales al terminar el servicio, a elección del responsable. Cuando el servidor nuevo funcione de forma estable, pide al proveedor antiguo que confirme la eliminación de archivos, bases de datos y copias.
Despliegue de WordPress con GitHub Actions y rollback
- Despliega desde el repositorio. Un workflow de GitHub Actions o GitLab CI compila los assets del tema y publica el código en cada push a la rama principal, así que en el servidor no hay archivos editados a mano.
- Conserva la versión anterior. Cada versión va a su propio directorio y un enlace simbólico apunta a la activa. Revertir el código es apuntar el enlace a la versión anterior. Haz un
wp db exportantes de cualquier paso que cambie la base de datos, porque revertir el código no deshace cambios en tablas ni en contenido. - Las mismas versiones en todas partes. Iguala las versiones de PHP y de MySQL o MariaDB entre local, staging y producción, para que una migración probada en staging se comporte igual en producción.
Cómo trata wp search-replace los datos serializados
El manual de WordPress advierte que una búsqueda y reemplazo general en la base de datos puede romper los datos serializados y que la columna guid de wp_posts no se debe cambiar nunca (Moving WordPress). wp search-replace está hecho para este caso: maneja datos PHP serializados y no cambia los valores de clave primaria (WP-CLI: wp search-replace). Las opciones que importan en una migración:
--dry-runinforma de lo que cambiaría y no guarda nada.--skip-columns=guiddeja los GUID de las entradas como están.--precisefuerza el procesamiento en PHP de todas las columnas. Es más lento y más fiable con datos serializados complejos.--networkabarca todas las tablas de una red multisitio. Sin ella, solo se buscan las tablas del sitio actual.--all-tables-with-prefixañade tablas que los plugins crearon con el prefijo de WordPress sin registrarlas, y--all-tablestoma todas las tablas de la base de datos.--export=archivo.sqlescribe los datos cambiados en un archivo SQL en lugar de en la base de datos, útil cuando la base de destino está en otro servidor.
Las tablas sin clave primaria se omiten, así que una tabla de plugin sin ella necesita una revisión aparte. Para multisitio, el manual enumera además lo que hay que revisar a mano: las tablas wp_blogs y wp_site y las opciones home, siteurl y fileupload_url de cada sitio.
wp db export y wp db import completan el conjunto. La exportación ejecuta mysqldump con las credenciales de wp-config.php y acepta cualquier opción de mysqldump, y wp db export - escribe en STDOUT (WP-CLI: wp db export). La importación no crea la base de datos, solo ejecuta el SQL del archivo, y wp db import - lee de STDIN (WP-CLI: wp db import). Crea antes la base de datos vacía en el destino.
Casos reales de migración de WordPress
Caso de estudio 1: tienda con 50.000 productos a un nuevo dominio
Escenario: Una tienda online popular con más de 50,000 productos necesitaba migrar de tienda-antigua.com a marcanew.com manteniendo los rankings SEO y la confianza del clientes.
Desafíos Enfrentados:
- Base de datos masiva de productos con variaciones complejas
- Sesiónes activas de carrito de compras durante la migración
- Integraciones con pasarelas de pago de terceros
- Campañas de email con enlaces al dominio antiguo
Estrategia de Migración:
Preparación pre-migración (2 semanas):
- Creación de copia de seguridad completa incluyendo datos de clientes
- Configuración de entorno de staging temporal
- Pruebas de todas las integraciones de pasarelas de pago
- Preparación de plantillas de email para notificación a clientes
Implementación técnica (4 horas):
- Uso de WP-CLI para reemplazo de URLs en la base de datos
- Implementación de reglas de redirección 301 personalizadas
- Actualización de todos los endpoints de API de terceros
- Configuración de certificado SSL para el nuevo dominio
Optimización post-migración (1 semana):
- Monitoreo de Google Search Console para problemas de indexación
- Actualización de todos los flujos de automatización de marketing
- Implementación de seguimiento mejorado para impacto de la migración
- Encuesta de satisfacción del clientes
Resultados:
- Casi todos los rankings SEO mantenidos en 2 semanas
- Cero pérdida de datos durante la migración
- Quejas de clientes claramente reducidas con comunicación adecuada
- Mejora de la velocidad del sitio gracias a la nueva infraestructura de hosting
Lecciones Clave Aprendidas:
- La comunicación con el clientes es tan importante como la ejecución técnica
- Probar las pasarelas de pago en entorno de staging previene pérdida de ingresos
- Tener un plan de rollback listo proporciona confianza durante la ejecución
Caso de estudio 2: red multisitio de 200 sitios a la nube
Escenario: Una institución educativa con más de 200 sitios en subdominios necesitaba migrar de hosting compartido a infraestructura cloud dedicada.
Complejidad Técnica:
- 201 sitios WordPress individuales
- Roles de usuario personalizados y permisos entre sitios
- Biblioteca de medios compartida con más de 100GB de contenido
- Dependencias complejas de plugins entre sitios
Enfoque de Migración:
Fase de Análisis de la Red:
- Mapeo de todas las interdependencias entre sitios
- Identificación de configuraciones personalizadas de plugins
- Documentación de jerarquías de roles de usuario
- Análisis de patrones de uso de la biblioteca de medios
Configuración del Entorno de Staging:
- Replicación exacta de la configuración del servidor
- Creación de scripts de prueba automatizados
- Implementación de monitoreo de rendimiento
- Configuración de procedimientos de rollback
Migración por Fases:
- Migración de 10 sitios piloto primero
- Documentación y refinamiento del proceso
- Migración por lotes de los sitios restantes
- Monitoreo y optimización continúa
Soluciones Técnicas:
## Script personalizado para migración multisitio por lotes
#!/bin/bash
for site in $(wp site list --field=url); do
echo "Migrando $site"
wp search-replace 'dominio-antiguo.com' 'dominio-nuevo.com' --url=$site
wp cache flush --url=$site
doneResultados:
- 99.8% de tiempo de actividad durante el proceso de migración
- 40% de mejora en los tiempos de carga de página
- Cero corrupción de datos en todos los sitios
- Administración simplificada a través de gestión centralizada
Caso de estudio 3: blog a HTTPS y corrección de contenido mixto
Escenario: Un blog con gran cantidad de contenido con más de 10,000 publicaciones y una amplia biblioteca de medios necesitaba la implementación de HTTPS.
Desafíos de Contenido Mixto:
- Enlaces HTTP codificados directamente en el contenido de publicaciones
- Recursos externos sin alternativas HTTPS
- Iframes incrustados de fuentes no seguras
- CSS personalizado con referencias HTTP
Solución Integral:
- Auditoría y Limpieza de Contenido:
-- Buscar y reemplazar referencias HTTP en publicaciones
UPDATE wp_posts
SET post_content = REPLACE(post_content, 'http://ejemplo.com', 'https://ejemplo.com')
WHERE post_content LIKE '%http://ejemplo.com%';
-- No toques la columna guid: la documentación de WordPress dice que nunca se cambia- Actualizaciones de Configuración de Plugins:
// Adiciones personalizadas a functions.php para forzar HTTPS
add_action('template_redirect', function() {
if (!is_ssl() && !is_admin()) {
wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301);
exit;
}
});- Configuración Avanzada de .htaccess:
## Forzar HTTPS para todo el tráfico
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]Impacto en el Rendimiento:
- Caída inicial del 5% en el tráfico durante la primera semana
- Recuperación total en 3 semanas
- 10% de mejora en los rankings de búsqueda
- Métricas mejoradas de confianza del usuario y seguridad
Migrar bases de datos WordPress grandes y datos serializados
Cómo migrar bases de datos de más de 1 GB
Manejo eficiente de bases de datos grandes
Para bases de datos que superan 1GB, los métodos estándar de exportación/importación a menudo fallan. Aquí tienes técnicas avanzadas:
Método 1: Exportación por Fragmentos con WP-CLI
## Exportar por fragmentos para bases de datos grandes
wp db export fragmento1.sql --tables=wp_posts,wp_postmeta --add-drop-table
wp db export fragmento2.sql --tables=wp_options,wp_users,wp_usermeta --add-drop-table
## Combinar e importar por separado
mysql nueva_base_datos < fragmento1.sql
mysql nueva_base_datos < fragmento2.sqlMétodo 2: volcado comprimido con gzip en lugar de un script PHP propio
## Enviar el volcado directamente a gzip, sin archivo sin comprimir en disco
wp db export - --single-transaction --quick | gzip > db.sql.gz
## Importar desde STDIN en el servidor de destino
gunzip < db.sql.gz | wp db import -Manejo de datos serializados
WordPress almacena muchas configuraciones como datos PHP serializados, que se rompen cuando cambian las longitudes de las URLs:
Reemplazo seguro para datos serializados con WP-CLI:
## Primero la vista previa, después sin --dry-run
wp search-replace 'https://dominioviejo.com' 'https://dominionuevo.com' --skip-columns=guid --precise --dry-run
wp search-replace 'https://dominioviejo.com' 'https://dominionuevo.com' --skip-columns=guid --preciseScript bash para automatizar la migración de WordPress
Framework de automatización de migración
Crea un script completo de automatización de migración:
#!/bin/bash
## Script de Automatización de Migración WordPress
set -e # Salir ante cualquier error
## Configuración
OLD_DOMAIN="sitio-viejo.com"
NEW_DOMAIN="sitio-nuevo.com"
BACKUP_DIR="/ruta/a/copias"
STAGING_DIR="/ruta/a/staging"
LOG_FILE="$BACKUP_DIR/migración_$(date +%Y%m%d_%H%M%S).log"
## Función de registro
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
## ¿Qué comprobar antes de migrar un sitio WordPress?
pre_migration_checks() {
log "Iniciando verificaciones pre-migración"
# Verificar instalación de WordPress
if ! wp core is-installed --path=/var/www/html; then
log "ERROR: Instalación de WordPress no encontrada"
exit 1
fi
# Verificar conexión a base de datos
if ! wp db check --path=/var/www/html; then
log "ERROR: Falló la conexión a la base de datos"
exit 1
fi
# Crear directorio de copias de seguridad
mkdir -p "$BACKUP_DIR"
mkdir -p "$STAGING_DIR"
log "Verificaciones pre-migración completadas"
}
## Creación de copias de seguridad
create_backups() {
log "Creando copias de seguridad completas"
# Copia de seguridad de base de datos
wp db export "$BACKUP_DIR/base_datos_$(date +%Y%m%d_%H%M%S).sql" --path=/var/www/html
# Copia de seguridad de archivos
tar -czf "$BACKUP_DIR/archivos_$(date +%Y%m%d_%H%M%S).tar.gz" /var/www/html
# Copia de seguridad de configuración
cp /var/www/html/wp-config.php "$BACKUP_DIR/wp-config_$(date +%Y%m%d_%H%M%S).php"
log "Copias de seguridad completadas exitosamente"
}
## Reemplazo de URLs
replace_urls() {
log "Iniciando proceso de reemplazo de URLs"
# URLs principales de WordPress
wp search-replace "$OLD_DOMAIN" "$NEW_DOMAIN" --skip-columns=guid --path=/var/www/html
log "Reemplazo de URLs completado"
}
## Validación post-migración
post_migration_validation() {
log "Iniciando validación post-migración"
# Probar accesibilidad del sitio
if curl -f -s "https://$NEW_DOMAIN" > /dev/null; then
log "El sitio es accesible"
else
log "ERROR: El sitio no es accesible"
exit 1
fi
# Probar admin de WordPress
if curl -f -s "https://$NEW_DOMAIN/wp-admin/" > /dev/null; then
log "Admin de WordPress es accesible"
else
log "ERROR: Admin de WordPress no es accesible"
exit 1
fi
# Verificar integridad de la base de datos
wp db check --path=/var/www/html
log "Validación post-migración completada"
}
## Ejecución principal
main() {
log "Iniciando proceso de migración WordPress"
pre_migration_checks
create_backups
replace_urls
post_migration_validation
log "Migración completada exitosamente"
}
## Ejecutar función principal
mainConfigurar Nginx, PHP y MySQL tras la migración
Ajustes de Nginx y PHP tras la migración
Configuración Nginx para sitios migrados
server {
listen 80;
server_name sitio-nuevo.com www.sitio-nuevo.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name sitio-nuevo.com www.sitio-nuevo.com;
root /var/www/html;
index index.php index.html;
# Configuración SSL
ssl_certificate /ruta/a/ssl/cert.pem;
ssl_certificate_key /ruta/a/ssl/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
# Configuración específica de WordPress
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# Optimizaciónes de rendimiento
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
# Configuración de caché
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Cabeceras de seguridad
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
}Optimización PHP para rendimiento de migración
; Configuración PHP optimizada para migración WordPress
memory_limit = 512M
max_execution_time = 300
max_input_time = 300
upload_max_filesize = 64M
post_max_size = 64M
max_input_vars = 3000
; Configuración OPcache para mejor rendimiento
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.fast_shutdown=1Ajuste del rendimiento de la base de datos
Optimización de la configuración MySQL
-- Optimización MySQL para WordPress
SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
SET GLOBAL innodb_log_file_size = 268435456; -- 256MB
SET GLOBAL innodb_flush_log_at_trx_commit = 2;
SET GLOBAL innodb_flush_method = O_DIRECT;
-- Configuración de caché de consultas
SET GLOBAL query_cache_type = ON;
SET GLOBAL query_cache_size = 67108864; -- 64MBEstrategia de indexación de la base de datos
-- Añadir índices para mejor rendimiento
ALTER TABLE wp_posts ADD INDEX idx_post_type_status (post_type, post_status);
ALTER TABLE wp_postmeta ADD INDEX idx_meta_key_value (meta_key, meta_value(191));
ALTER TABLE wp_options ADD INDEX idx_autoload (autoload, option_name);
-- Optimizar tablas grandes
OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_postmeta;
OPTIMIZE TABLE wp_options;Corregir datos serializados y errores de memoria al migrar
Errores de datos serializados, memoria y plugins
Problema 1: Corrupción de datos serializados
Problema: Después del reemplazo de URLs, las opciones del tema y la configuración de plugins se corrompen.
Diagnóstico:
<?php
// Listar opciones cuyo valor serializado ya no se puede deserializar (ejecutar con wp eval-file)
global $wpdb;
$rows = $wpdb->get_results( "SELECT option_name, option_value FROM {$wpdb->options}" );
foreach ( $rows as $row ) {
$v = $row->option_value;
if ( is_serialized( $v ) && 'b:0;' !== $v && false === @unserialize( $v ) ) {
echo $row->option_name . "\n";
}
}Solución:
## Restaurar el volcado previo al reemplazo y repetirlo con WP-CLI
wp db import backup-before-replace.sql
wp search-replace 'https://dominioviejo.com' 'https://dominionuevo.com' --skip-columns=guid --preciseProblema 2: Agotamiento de memoria durante migración de base de datos grande
Problema: Los límites de memoria PHP se exceden durante la importación/exportación de la base de datos.
Soluciones:
Método 1: Procesamiento por Fragmentos
<?php
// Procesar base de datos en fragmentos para evitar problemas de memoria
function process_database_in_chunks($table, $chunk_size = 1000) {
global $wpdb;
$offset = 0;
do {
$results = $wpdb->get_results("
SELECT * FROM $table
LIMIT $offset, $chunk_size
");
foreach ($results as $row) {
// Procesar cada fila
process_row($row);
}
$offset += $chunk_size;
// Liberar memoria
$wpdb->flush();
} while (count($results) === $chunk_size);
}
?>Método 2: Exportación de Base de Datos por Streaming
## Usar mysqldump con compresión para bases de datos grandes
mysqldump --single-transaction --quick --lock-tables=false \
--host=localhost --user=usuario --password=contraseña \
nombre_base_datos | gzip > backup.sql.gz
## Importar con streaming
gunzip < backup.sql.gz | mysql -u usuario -p nombre_base_datosProblema 3: Compatibilidad de plugins después de la migración
Problema: Los plugins dejan de funcionar después de los cambios de URL debido a referencias codificadas directamente.
Solución Sistemática:
- Crear Verificador de Compatibilidad de Plugins:
<?php
// Verificador de compatibilidad de plugins
function check_plugin_compatibility() {
$plugins = get_option('active_plugins');
$issues = [];
foreach ($plugins as $plugin_path) {
$plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_path);
// Verificar URLs codificadas en archivos de plugins
$plugin_files = glob(WP_PLUGIN_DIR . '/' . dirname($plugin_path) . '/*.php');
foreach ($plugin_files as $file) {
$content = file_get_contents($file);
// Buscar URLs potencialmente codificadas
if (preg_match('/https?:\/\/[^\s"\'<]+/', $content, $matches)) {
$issues[] = [
'plugin' => $plugin_data['Name'],
'file' => $file,
'hardcoded_urls' => $matches
];
}
}
}
return $issues;
}
?>- Reemplazar URL en ajustes de plugins con WP-CLI:
## Solo wp_options, modo PHP para valores serializados anidados
wp search-replace 'https://dominioviejo.com' 'https://dominionuevo.com' wp_options --precise --dry-runAutomatizar migraciones WordPress con GitHub Actions
Cómo probar migraciones en un pipeline de CI
Flujo de trabajo GitHub Actions para pruebas automatizadas
name: Prueba de Migración WordPress
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
migration-test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: wordpress_test
options: >-
--health-cmd="mysqladmin ping"
--health-interval=10s
--health-timeout=5s
--health-retries=3
steps:
- uses: actions/checkout@v3
- name: Configurar PHP
uses: shivammathur/setup-php@v2
with:
php-versión: '8.1'
extensións: mysqli, gd, xml, mbstring
- name: Instalar WordPress
run: |
curl -O https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz
cp -r wordpress/* /var/www/html/
- name: Configurar WordPress
run: |
cp wp-config-sample.php wp-config.php
sed -i "s/database_name_here/wordpress_test/" wp-config.php
sed -i "s/username_here/root/" wp-config.php
sed -i "s/password_here/password/" wp-config.php
sed -i "s/localhost/127.0.0.1/" wp-config.php
- name: Instalar WP-CLI
run: |
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
- name: Ejecutar Pruebas de Migración
run: |
wp core install --url=http://localhost --title="Sitio de Prueba" --admin_user=admin --admin_password=password [email protected]
wp plugin install all-in-one-wp-migration --activate
- name: Validar Migración
run: |
wp option get siteurl
wp option get homeScript de despliegue automatizado
#!/bin/bash
## Script de Despliegue Automatizado WordPress
set -e
## Variables de entorno
ENVIRONMENT=${1:-staging}
BACKUP_DIR="/copias/wordpress"
DEPLOY_LOG="/var/log/deploy.log"
## Función de registro
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$ENVIRONMENT] $1" | tee -a "$DEPLOY_LOG"
}
## Verificaciones pre-despliegue
pre_deployment_checks() {
log "Iniciando verificaciones pre-despliegue"
# Verificar si WordPress está instalado
if ! wp core is-installed --path=/var/www/html; then
log "ERROR: WordPress no está instalado correctamente"
exit 1
fi
# Verificar conectividad de base de datos
if ! wp db check --path=/var/www/html; then
log "ERROR: Falló la conexión a la base de datos"
exit 1
fi
# Verificar que los plugins requeridos están activos
if ! wp plugin is-active all-in-one-wp-migration --path=/var/www/html; then
log "ERROR: Plugin requerido de migración no está activo"
exit 1
fi
log "Verificaciones pre-despliegue completadas"
}
## Crear copia de seguridad del despliegue
create_deployment_backup() {
log "Creando copia de seguridad del despliegue"
local timestamp=$(date +%Y%m%d_%H%M%S)
local backup_file="$BACKUP_DIR/pre_deploy_${ENVIRONMENT}_$timestamp.sql"
wp db export "$backup_file" --path=/var/www/html
# Verificar integridad de la copia de seguridad
if [ -s "$backup_file" ] && tail -n 1 "$backup_file" | grep -q "Dump completed"; then
log "Copia de seguridad creada y verificada: $backup_file"
else
log "ERROR: Falló la creación de la copia de seguridad"
exit 1
fi
}
## Ejecutar migración
execute_migration() {
log "Ejecutando migración WordPress"
# Actualizar URLs del sitio si es necesario
if [ "$ENVIRONMENT" = "production" ]; then
wp search-replace "staging.ejemplo.com" "ejemplo.com" --skip-columns=guid --path=/var/www/html
fi
# Limpiar todas las cachés
wp cache flush --path=/var/www/html
# Actualizar reglas de reescritura
wp rewrite flush --path=/var/www/html
log "Migración completada"
}
## Validación post-despliegue
post_deployment_validation() {
log "Iniciando validación post-despliegue"
# Verificar accesibilidad del sitio
local site_url=$(wp option get siteurl --path=/var/www/html)
if curl -f -s "$site_url" > /dev/null; then
log "El sitio es accesible: $site_url"
else
log "ERROR: El sitio no es accesible"
exit 1
fi
# Verificar admin de WordPress
if curl -f -s "$site_url/wp-admin/" > /dev/null; then
log "Admin de WordPress es accesible"
else
log "ERROR: Admin de WordPress no es accesible"
exit 1
fi
# Verificar integridad de la base de datos
if wp db check --path=/var/www/html; then
log "Integridad de base de datos verificada"
else
log "ERROR: Falló la verificación de integridad de base de datos"
exit 1
fi
# Verificar plugins críticos
local critical_plugins=("all-in-one-wp-migration" "wp-super-cache")
for plugin in "${critical_plugins[@]}"; do
if wp plugin is-active "$plugin" --path=/var/www/html; then
log "Plugin $plugin está activo"
else
log "ADVERTENCIA: Plugin $plugin no está activo"
fi
done
log "Validación post-despliegue completada"
}
## Función principal de despliegue
main() {
log "Iniciando despliegue WordPress para entorno $ENVIRONMENT"
pre_deployment_checks
create_deployment_backup
execute_migration
post_deployment_validation
log "Despliegue completado exitosamente"
# Enviar notificación (opcional)
if command -v slack-cli &> /dev/null; then
slack-cli send "Despliegue WordPress a $ENVIRONMENT completado exitosamente"
fi
}
## Ejecutar función principal
mainConclusión
La migración de WordPress no tiene que ser abrumadora cuando se aborda de forma sistemática. Siguiendo esta guía completa, preparándote exhaustivamente y probando con diligencia, puedes migrar tu sitio WordPress con éxito y con una interrupción mínima para tus usuarios y el rendimiento SEO.
Recuerda que la preparación es clave: nunca intentes una migración sin copias de seguridad completas y un plan de rollback claro. Tómate tu tiempo, prueba exhaustivamente y no dudes en buscar ayuda profesional para migraciones complejas.
Con una planificación y ejecución adecuadas, tu migración de WordPress puede ser un proceso fluido que prepare tu sitio para el crecimiento y el éxito futuro.
En el lado de entrega mantenemos este tema bajo migración a Next.js o Astro.







