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.
Comprendiendo las URLs del Sitio WordPress
Antes de adentrarnos en las técnicas de migración, es fundamental entender las dos configuraciónes 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 configuraciónes deben incluir la parte https:// y no deben tener una barra diagonal / al final. Estas configuraciónes controlan cómo WordPress muestra las URLs a lo largo de tu sitio, incluyendo la sección de administración y el frontend.
Por Qué la Migración de WordPress Se Vuelve Necesaria
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
Preparación: La Clave Para una Migración Exitosa
Haz Copia de Seguridad de Todo
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/Temas: Documenta las configuraciónes personalizadas
Configuración del Entorno de Prueba
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/
Métodos de Migración: De Simple a Avanzado
Método 1: Usando wp-config.php (Solución Rápida)
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: Enfoque con functions.php (Solución Temporal)
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: Método de Reubicación de WordPress
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: Edición Directa de la Base de Datos
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!
Escenarios Avanzados de Migración
Mudanza Entre Servidores
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
Cambios de Nombre de Dominio
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:
## - Velvet Blues Update URLs
## - Better Search Replace
Importante: 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
Lista de Verificación Post-Migración
Acciones Inmediatas
- 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
Consideraciones SEO
- 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
Optimización del Rendimiento
- 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
Problemás Comunes de Migración y Soluciónes
Pantalla Blanca de la Muerte
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');
Problemás de Contenido Mixto
Recursos HTTP en páginas HTTPS causan advertencias de seguridad:
## Encontrar contenido mixto
grep -r "http://" wp-content/
Problemás 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');
Herramientas y Plugins para Migración
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 DB: Especialista en migración de bases de datos
- Velvet Blues Update URLs: Herramienta de actualización de URLs
Herramientas de Línea de Comandos
## 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-run
Consideraciones de Seguridad Durante la Migración
- 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
Optimización de la Base de Datos
OPTIMIZE TABLE wp_posts;
OPTIMIZE TABLE wp_postmeta;
OPTIMIZE TABLE wp_options;
Configuración de Caché
- 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
Pruebas y Validación
Pruebas de Funcionalidad
- 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
Validación SEO
- 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
Mantenimiento Post-Migración
Monitoreo
- 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
Optimización Continua
- 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
Casos Reales de Migración
Caso de Estudio 1: Migración de Dominio E-commerce
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
- Sesiones 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:
- 98% de los rankings SEO mantenidos en 2 semanas
- Cero pérdida de datos durante la migración
- Quejas de clientes reducidas en un 75% con comunicación adecuada
- 15% de aumento en 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: Migración de Red Multisitio
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 configuraciónes 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 continua
Soluciónes 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
done
Resultados:
- 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: Migración HTTP a HTTPS con Resolución de Contenido Mixto
Escenario: Un blog con gran cantidad de contenido con más de 10,000 publicaciónes 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 publicaciónes
- 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 publicaciónes
UPDATE wp_posts
SET post_content = REPLACE(post_content, 'http://ejemplo.com', 'https://ejemplo.com')
WHERE post_content LIKE '%http://ejemplo.com%';
-- Actualizar campos guid (¡con cuidado!)
UPDATE wp_posts
SET guid = REPLACE(guid, 'http://ejemplo.com', 'https://ejemplo.com')
WHERE guid LIKE 'http://ejemplo.com%';
- 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]
## Manejar contenido mixto en WordPress
RewriteCond %{HTTP_REFERER} !^https://
RewriteRule ^(.*)$ - [F]
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
Técnicas Avanzadas de Migración
Estrategias de Optimización de Migración de Base de Datos
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 --tables=wp_posts,wp_postmeta --add-drop-table
wp db export --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.sql
Método 2: Script PHP Personalizado para Gestión de Memoria
<?php
// Script personalizado de migración de base de datos
set_time_limit(0);
ini_set('memory_limit', '1024M');
$source = new mysqli('localhost', 'usuario', 'contraseña', 'bd_origen');
$target = new mysqli('localhost', 'usuario', 'contraseña', 'bd_destino');
// Migrar en lotes de 1000 registros
$offset = 0;
$batch_size = 1000;
do {
$result = $source->query("SELECT * FROM wp_posts LIMIT $offset, $batch_size");
$count = $result->num_rows;
while ($row = $result->fetch_assoc()) {
$columns = implode(',', array_keys($row));
$values = implode(',', array_map([$target, 'real_escape_string'], $row));
$target->query("INSERT INTO wp_posts ($columns) VALUES ($values)");
}
$offset += $batch_size;
} while ($count == $batch_size);
?>
Manejo de Datos Serializados
WordPress almacena muchas configuraciónes como datos PHP serializados, que se rompen cuando cambian las longitudes de las URLs:
Corrección Avanzada de Serialización:
<?php
// Corregir datos serializados después de cambios de URL
function fix_serialized_urls($old_url, $new_url) {
global $wpdb;
$options = $wpdb->get_results("SELECT option_id, option_value FROM $wpdb->options WHERE option_value LIKE '%$old_url%'");
foreach ($options as $option) {
$fixed_value = str_replace($old_url, $new_url, $option->option_value);
// Verificar si son datos serializados
if (is_serialized($fixed_value)) {
$unserialized = unserialize($fixed_value);
if ($unserialized !== false) {
$fixed_value = serialize($unserialized);
}
}
$wpdb->update(
$wpdb->options,
['option_value' => $fixed_value],
['option_id' => $option->option_id]
);
}
}
?>
Desarrollo de Scripts de Migración Personalizados
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"
}
## Verificaciones pre-migración
pre_migration_checks() {
log "Iniciando verificaciónes 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
# Reemplazos adicionales de URL en tablas específicas
wp db query "UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, '$OLD_DOMAIN', '$NEW_DOMAIN') WHERE meta_value LIKE '%$OLD_DOMAIN%'" --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
main
Estrategias de Optimización del Rendimiento
Optimización de la Configuración del Servidor
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=1
Ajuste 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; -- 64MB
Estrategia 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;
Guía Avanzada de Resolución de Problemas
Problemás Complejos de Migración y Soluciónes
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
// Verificar datos serializados corruptos
function check_serialized_data() {
global $wpdb;
$corrupted = $wpdb->get_results("
SELECT option_id, option_name
FROM {$wpdb->options}
WHERE option_value LIKE '%:%'
AND (option_value NOT LIKE 'a:%' OR option_value NOT LIKE '%;\"%\";%')
");
foreach ($corrupted as $option) {
echo "Opción corrupta: {$option->option_name}\n";
}
}
?>
Solución:
<?php
// Reparación avanzada de datos serializados
function repair_serialized_data($old_length, $new_length) {
global $wpdb;
// Obtener todas las opciones serializadas
$serialized_options = $wpdb->get_results("
SELECT option_id, option_value
FROM {$wpdb->options}
WHERE option_value REGEXP '^[aO]:[0-9]+:'
");
foreach ($serialized_options as $option) {
$data = $option->option_value;
// Actualizar referencias de longitud en datos serializados
$pattern = '/s:([0-9]+):\"(.*?)\";/s';
$callback = function($matches) use ($old_length, $new_length) {
$length = strlen($matches[2]);
return 's:' . $length . ':"' . $matches[2] . '";';
};
$repaired = preg_replace_callback($pattern, $callback, $data);
if ($repaired !== $data) {
$wpdb->update(
$wpdb->options,
['option_value' => $repaired],
['option_id' => $option->option_id]
);
}
}
}
?>
Problema 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.
Soluciónes:
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_datos
Problema 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;
}
?>
- Actualizador Automático de URLs de Plugins:
<?php
// Actualizar configuraciónes de plugins con nuevas URLs
function update_plugin_configurations($old_url, $new_url) {
global $wpdb;
// Actualizar opciones de plugins
$plugin_options = $wpdb->get_results("
SELECT option_name, option_value
FROM {$wpdb->options}
WHERE option_name LIKE 'plugin_%'
OR option_name LIKE '%_options'
");
foreach ($plugin_options as $option) {
if (strpos($option->option_value, $old_url) !== false) {
$updated_value = str_replace($old_url, $new_url, $option->option_value);
$wpdb->update(
$wpdb->options,
['option_value' => $updated_value],
['option_name' => $option->option_name]
);
}
}
}
?>
Automatización de Migración e Integración CI/CD
Integración Continua para Migraciones WordPress
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 --admin_email=test@example.com
wp plugin install all-in-one-wp-migration --activate
- name: Validar Migración
run: |
wp option get siteurl
wp option get home
Script 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 verificaciónes 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 wp db import "$backup_file" --path=/var/www/html --dry-run; 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
main
Conclusió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.

