Migración WordPress: hosting, dominio, base de datos y redirecciones
ES

Migración WordPress: hosting, dominio, base de datos y redirecciones

Última verificación: 1 de mayo de 2026
23min de lectura
Guía
Desarrollador full-stack
500+ proyectos WP

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 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.

#Por Qué la Migración de WordPress Se Vuelve Necesaria

Existen varios escenarios que pueden requerir la migración de tu sitio WordPress:

  1. Cambios de Dominio: Rebranding o cambio a un mejor nombre de dominio
  2. Migración de Hosting: Mudanza a un mejor proveedor de hosting
  3. Cambios de Servidor: Actualización de la infraestructura del servidor
  4. Reestructuración del Sitio: Mover WordPress a un subdirectorio o directorio raíz
  5. De Desarrollo a Producción: Paso de entorno de staging a producción
  6. 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:

  1. Copia de Seguridad de Base de Datos: Exporta tu base de datos WordPress vía phpMyAdmin o WP-CLI
  2. Copia de Seguridad de Archivos: Descarga todos los archivos y directorios de WordPress
  3. Copia de Seguridad de Configuración: Guarda tu archivo wp-config.php por separado
  4. Configuraciónes de Plugins/Temás: Documenta las configuraciones 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:

  1. Accede al archivo functions.php de tu tema activo
  2. 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');
  1. Sube el archivo y visita tu panel de administración
  2. 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:

  1. Edita wp-config.php y añade antes de “¡Eso es todo, deja de editar!”:
define('RELOCATE', true);
  1. Visita https://tusitio.com/wp-login.php
  2. Inicia sesión normalmente
  3. Verifica las URLs en Ajustes > Generales
  4. 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:

  1. Accede a phpMyAdmin
  2. Selecciona tu base de datos WordPress
  3. Encuentra la tabla wp_options (el prefijo puede variar)
  4. Edita las filas ‘siteurl’ y ‘home’
  5. 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:

  1. Copia de Seguridad Completa: Respaldo total del sitio y la base de datos
  2. Exportar Base de Datos: Usa phpMyAdmin o WP-CLI
  3. Transferir Archivos: Usa FTP, SFTP o rsync
  4. Importar Base de Datos: Crea una nueva base de datos e importa
  5. Actualizar wp-config.php: Modifica las credenciales de la base de datos
  6. Actualizar URLs: Usa uno de los métodos anteriores
  7. 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:

  1. Actualizar URLs en Admin de WordPress: Ajustes > Generales
  2. Copiar Archivos: Mover los archivos de WordPress a la nueva ubicación
  3. Actualizar .htaccess: Modificar las reglas de reescritura
  4. Actualizar Permalinks: Volver a guardar la estructura de enlaces permanentes
  5. Verificar Enlaces Internos: Actualizar URLs codificadas directamente

#Migración Multisitio

WordPress Multisitio requiere consideraciones adicionales:

  1. Respaldo de la Red: Todos los sitios y bases de datos
  2. Editar wp-config.php: Actualizar las constantes multisitio
  3. Actualizar .htaccess: Modificar las reglas de reescritura multisitio
  4. Actualizaciones de Base de Datos: Actualizar las tablas wp_blogs y wp_site
  5. 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 redirecciónes 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

  1. All-in-One WP Migration: Herramienta completa de migración de sitios
  2. Duplicator: Crea paquetes de migración fácilmente
  3. WP Migrate DB: Especialista en migración de bases de datos
  4. 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

  1. Usa HTTPS: Asegúrate de que SSL esté configurado en el nuevo servidor
  2. Actualiza los Permisos de Archivos: Protege wp-config.php (600) y los directorios (755)
  3. Elimina Scripts de Migración: Borra archivos temporales y constantes
  4. Actualiza las Claves de Seguridad: Genera nuevas claves de WordPress en wp-config.php
  5. 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

  1. Navegación: Todos los elementos del menú funcionan correctamente
  2. Formularios: Los formularios de contacto y envíos funcionan
  3. Búsqueda: La búsqueda del sitio devuelve resultados
  4. Comentarios: El sistema de comentarios funciona
  5. Medios: Las imágenes y videos cargan correctamente

#Validación SEO

  1. Meta Tags: Los títulos y descripciones se muestran correctamente
  2. URLs Canónicas: Apuntan al nuevo dominio
  3. Datos Estructurados: El marcado schema se válida correctamente
  4. 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
  • 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:

  1. 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
  2. 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
  3. 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:

  1. 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
  2. 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
  3. 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

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 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:

  1. 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%';

-- Actualizar campos guid (¡con cuidado!)
UPDATE wp_posts
SET guid = REPLACE(guid, 'http://ejemplo.com', 'https://ejemplo.com')
WHERE guid LIKE 'http://ejemplo.com%';
  1. 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;
    }
});
  1. 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 configuraciones 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:

  1. 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;
}
?>
  1. Actualizador Automático de URLs de Plugins:
<?php
// Actualizar configuraciones 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 [email protected]
        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.

Siguiente paso

Transforma el artículo en una implementación real

Este bloque refuerza el enlazado interno y lleva al lector al siguiente paso más útil dentro de la arquitectura del sitio.

Cluster relacionado

Explora otros servicios WordPress y base de conocimiento

Refuerza tu negocio con soporte técnico profesional en áreas clave del ecosistema WordPress.

¿Cuánto tiempo toma una migración de WordPress? #
El tiempo de migración varía según el tamaño del sitio: Sitios pequeños (1-5GB): 1-2 horas, Sitios mediaños (5-20GB): 2-4 horas, Sitios grandes (20GB+): 4+ horas.
¿Necesito habilidades técnicas para migrar WordPress? #
Las habilidades técnicas básicas son útiles, pero con la orientación y las herramientas adecuadas, incluso los principiantes pueden migrar sitios WordPress con éxito.
¿Se verá afectado mi SEO por la migración? #
Una migración ejecutada correctamente con redirecciónes 301 preserva los rankings SEO. Siempre informa a Google sobre los cambios de dominio a través de Search Console.
¿Cuál es la diferencia entre migración manual y con plugin? #
La migración manual ofrece control total pero requiere conocimiento técnico. La migración con plugin es más fácil pero puede tener limitaciones para sitios complejos.
¿Cómo migro una instalación WordPress multisitio? #
La migración multisitio requiere un manejo especial de configuraciones de red, bases de datos compartidas y mapeo de dominios. Considera ayuda profesional para migraciones multisitio complejas.

¿Necesitas un FAQ adaptado a tu sector y mercado? Preparamos una versión alineada con tus objetivos de negocio.

Hablemos

Artículos Relacionados

WordPress 7.0 con AI Client vs Astro 6 tras la adquisición de Cloudflare. Comparativa de velocidad, coste, SEO y seguridad. Mi opinión tras 20 años como desarrollador WP - cuándo migrar y cuándo quedarse.
wordpress

WordPress 7.0 vs Astro 6 tras la adquisición de Cloudflare - ¿quién gana en 2026?

WordPress 7.0 con AI Client vs Astro 6 tras la adquisición de Cloudflare. Comparativa de velocidad, coste, SEO y seguridad. Mi opinión tras 20 años como desarrollador WP - cuándo migrar y cuándo quedarse.

Guía completa de WordPress Multisite para despliegues enterprise. Aprende patrones de arquitectura, escalabilidad a 1000+ sitios, hardening de seguridad, mapeo de dominios, gestión de usuarios y optimización de costes para redes de franquicias, universidades y organismos gubernamentales.
wordpress

WordPress Multisite para Enterprise: Arquitectura, Escalabilidad y Mejores Prácticas

Guía completa de WordPress Multisite para despliegues enterprise. Aprende patrones de arquitectura, escalabilidad a 1000+ sitios, hardening de seguridad, mapeo de dominios, gestión de usuarios y optimización de costes para redes de franquicias, universidades y organismos gubernamentales.

Como migrar tu sitio web a Next.js o Astro? Guía práctica de migración desde WordPress, Joomla, Drupal y frameworks legacy. PageSpeed 95-100, preservacion SEO, cero tiempo de inactividad.
wordpress

Migración a Next.js y Astro: SEO, riesgos y arquitectura

Como migrar tu sitio web a Next.js o Astro? Guía práctica de migración desde WordPress, Joomla, Drupal y frameworks legacy. PageSpeed 95-100, preservacion SEO, cero tiempo de inactividad.