Mover un sitio WordPress (ej. de dev.site.com a site.com) parece simple: solo ejecute un “Buscar y Reemplazar” en la base de datos, verdad?
Conozca más sobre la migración de sitios web a Astro y Next.js en WPPoland. INCORRECTO.
Si intenta ejecutar una consulta SQL cruda como:
UPDATE wp_options SET option_value = replace(option_value, 'old.com', 'new.com')
…rompera su sitio. Especificamente, perdera Widgets, Opciones de Tema y algunas configuraciónes de Plugins.
El error comun: Buscar y reemplazar simple
Muchos desarrolladores (e incluso algunos proveedores de hosting) sugieren usar una simple función SQL REPLACE() para actualizar URLs. Este enfoque parece lógico pero es fundamentalmente defectuoso.
La tentacion:
-- Esto parece seguro, pero NO lo es
UPDATE wp_options
SET option_value = REPLACE(option_value, 'https://old.com', 'https://new.com');
Que sucede:
- Algunas URLs se actualizan correctamente
- Los datos serializados se corrompen
- Los widgets desaparecen
- Las opciones de tema se rompen
- Las configuraciónes de plugins se pierden
- El sitio queda parcialmente roto
Por que falla: WordPress no almacena datos como texto plano. Gran parte se almacena como datos PHP serializados, que requieren manejo especial.
Entendiendo los datos serializados: El problema central
Que es la serializacion?
WordPress almacena datos complejos (arrays, objetos) en la base de datos como cadenas serializadas. La serializacion convierte estructuras de datos PHP en cadenas que pueden almacenarse en la base de datos.
Ejemplo de datos serializados:
// Array PHP original
array(
'home' => 'https://old.com',
'siteurl' => 'https://old.com',
'admin_email' => 'admin@old.com'
)
// Cadena serializada (almacenada en la base de datos)
a:3:{s:4:"home";s:17:"https://old.com";s:7:"siteurl";s:17:"https://old.com";s:11:"admin_email";s:15:"admin@old.com";}
Desglose de la cadena serializada
Decodifiquemos a:3:{s:4:"home";s:17:"https://old.com";...}:
a:3= array con 3 elementoss:4:"home"= cadena, 4 caracteres, valor “home”s:17:"https://old.com"= cadena, 17 caracteres, valor “https://old.com”
La parte crítica:
El número 17 representa el conteo exacto de caracteres de la cadena "https://old.com".
Que ocurre con un reemplazo simple?
Original:
s:17:"https://old.com"
Despues del reemplazo simple (old.com a new-domain.com):
s:17:"https://new-domain.com"
El problema:
- La longitud de la cadena cambio de 17 a 23 caracteres
- La serializacion aun dice
s:17(espera 17 caracteres) - PHP intenta leer 17 caracteres:
"https://new-domain" - Falta la parte
.com - El array completo se vuelve invalido
- Los datos se corrompen
La solución: Herramientas conscientes de serializacion
Necesita una herramienta que:
- Deserialice los datos (convierta la cadena de vuelta a un array PHP)
- Reemplace el texto dentro del array
- Recalcule los conteos de caracteres
- Reserialice los datos (convierta de vuelta a cadena)
- Actualice la base de datos
Método 1: WP-CLI (recomendado)
La forma profesional: Si tiene acceso SSH, WP-CLI es la mejor herramienta para el trabajo.
Uso básico:
wp search-replace 'https://old.com' 'https://new.com' --all-tables
Opciones avanzadas:
## Prueba en seco (ver que cambiaria)
wp search-replace 'https://old.com' 'https://new.com' --all-tables --dry-run
## Solo tablas específicas
wp search-replace 'https://old.com' 'https://new.com' wp_posts wp_postmeta
## Omitir columnas específicas
wp search-replace 'https://old.com' 'https://new.com' --all-tables --skip-columns=guid
## Exportar cambios a archivo SQL primero
wp search-replace 'https://old.com' 'https://new.com' --all-tables --export=changes.sql
Por que WP-CLI es la mejor opción:
- Maneja la serializacion correctamente
- Rápido y eficiente
- Puede previsualizar cambios (dry-run)
- Control por linea de comandos
- Scriptable y automatizable
- Sin sobrecarga de plugins
Método 2: Plugin Better Search Replace
Para usuarios sin linea de comandos: Si no tiene acceso SSH, use el plugin Better Search Replace de WP Engine.
Uso:
- Vaya a Herramientas > Better Search Replace
- Ingrese URL antigua:
https://old.com - Ingrese URL nueva:
https://new.com - Seleccione tablas (o marque “Seleccionar todas”)
- Importante: Marque “Ejecutar como prueba en seco?” primero
- Haga clic en “Ejecutar buscar/reemplazar”
- Revise los resultados
- Desmarque “Ejecutar como prueba en seco?”
- Haga clic en “Ejecutar buscar/reemplazar” nuevamente para ejecutar
Lista de verificación de migración completa
Antes de la migración
1. Hacer backup de todo:
## Backup de base de datos
wp db export backup.sql
## Backup de archivos
tar -czf site-backup.tar.gz /path/to/wordpress
2. Probar en staging:
- Nunca pruebe en producción
- Use entorno de staging
- Verifique toda la funcionalidad
Durante la migración
1. Actualizar URLs de base de datos:
## Usando WP-CLI
wp search-replace 'https://old.com' 'https://new.com' --all-tables --dry-run
wp search-replace 'https://old.com' 'https://new.com' --all-tables
2. Actualizar wp-config.php:
define('WP_HOME','https://new.com');
define('WP_SITEURL','https://new.com');
Despues de la migración
1. Verificar URLs:
- Verificar página principal
- Probar enlaces internos
- Verificar que las imágenes cargan
- Verificar area de administración
2. Actualizar Search Console:
- Agregar nueva propiedad
- Enviar sitemap
- Solicitar indexacion
3. Limpiar caches:
## Limpiar todos los transients
wp transient delete --all
## Optimizar tablas
wp db optimize
Escenarios comunes de migración
Staging a producción
wp search-replace 'staging.site.com' 'site.com' --all-tables
HTTP a HTTPS
wp search-replace 'http://site.com' 'https://site.com' --all-tables
Cambio de dominio
wp search-replace 'old-domain.com' 'new-domain.com' --all-tables
Resolución de problemas
Los widgets desaparecieron
Causa: Datos serializados corrompidos Solución: Restaure desde su backup y use una herramienta consciente de serializacion.
Opciones de tema se restablecieron
Causa: Mods de tema corrompidos Solución: Restaure desde backup si esta corrupto.
Imágenes no cargan
Causa: URLs de imágenes no actualizadas Solución:
wp search-replace 'https://old.com/wp-content' 'https://new.com/wp-content' --all-tables
Mejores prácticas
- Siempre haga backup primero
- Use prueba en seco primero
- Actualice multiples patrones (HTTP y HTTPS, con y sin www)
- Verifique despues de la migración
- Actualice archivos de configuración (wp-config.php, .htaccess)
Conclusion clave: WordPress usa datos serializados extensivamente. El buscar y reemplazar simple rompe estos datos. Siempre use herramientas que entiendan la serializacion. El comando search-replace de WP-CLI es el estándar de oro: es rápido, seguro y maneja todos los casos extremos correctamente.
Conozca más sobre los servicios de desarrollo WordPress y la migración a Astro y Next.js en WPPoland.

