Guía completa de migración de sitios WordPress. Aprende a mover tu sitio WordPress de forma segura, cambiar dominios, actualizar hosting y evitar errores comunes de migración.
ES

Guía Completa de Migración WordPress: Mueve Tu Sitio de Forma Segura en 2024

4.90 /5 - (234 votes )
Ú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 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:

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

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

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

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

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

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

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 medianos (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 redirecciones 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 configuraciónes 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? Guia completa de migración desde WordPress, Joomla, Drupal y frameworks legacy. PageSpeed 95-100, preservacion SEO, cero tiempo de inactividad.
wordpress

Migración de Sitio Web a Next.js y Astro: Guia Completa 2026

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