---
titulo: Checklist completo de migración de Avada a Astra
autor: Auditour — Auditoría Turística SL
web: https://auditour.eu
version: 1.0
metodo: WP Staging (gratuito) + renombrado de carpetas + AB Fusion Inventory
probado_en: 3 migraciones reales
tags: [wordpress, avada, astra, migracion, checklist]
---

# Checklist — migrar WordPress de Avada a Astra

> **Cómo usarlo.** Recorre las fases en orden. Los pasos marcados con 🛑 requieren decisión o intervención humana: no los automatices.
> **Antes de empezar:** copia de seguridad completa. Ninguna guía sustituye a un backup.

---

## Fase 0 · ¿Es tu web candidata?

- [ ] Contar contenidos con Fusion Builder

```sql
SELECT COUNT(*) FROM wp_postmeta
WHERE meta_key IN ('_fusion','fusion_builder_status');
```

- [ ] Ver qué hay fuera de `post_content`

```sql
SELECT post_type, post_status, COUNT(*) AS n
FROM wp_posts
WHERE post_type LIKE 'fusion%' OR post_type LIKE 'avada%' OR post_type LIKE 'slide%'
GROUP BY post_type, post_status;
```

| CPT | Qué contiene | Se rehace en |
|---|---|---|
| `fusion_tb_section` | Cabeceras, pies, plantillas globales | Constructor de Astra |
| `fusion_element` | Elementos reutilizables | HTML o patrón de Gutenberg |
| `fusion_template` | Plantillas de contenido | Manual |
| `slide` | Slides del Fusion Slider | Decidir si se mantiene |
| `fusion_form` | Formularios de Avada | Contact Form 7 u otro |

**Regla práctica:** si la mayoría es texto corrido en contenedores de ancho completo, adelante. Si casi todo son maquetaciones complejas, el coste se acerca al de rehacer la web.

- [ ] 🛑 **Decidir la congelación de publicaciones.** Todo lo que se publique en producción tras el clonado se pierde al promover. Pactarlo el primer día, no al final.

---

## Fase 1 · Clonar a staging

- [ ] Instalar **WP Staging** y **Better Search Replace**
- [ ] Crear el clon con nombre reconocible (`astra`)
- [ ] 🚨 **Subir «Omitir archivos mayores de» de 8 MB a 1024 MB.** Deja fuera vídeos, PDF y ZIP sin avisar
- [ ] Anotar: **prefijo de tablas** del clon, base de datos y ruta física
- [ ] 🛑 Iniciar sesión en el clon (suele estar protegido por login)

### Lo que WP Staging hace por su cuenta

- [ ] Pone `WP_CACHE` a `false`
- [ ] **Desactiva los enlaces permanentes** → las URLs pasan a `?page_id=123`
- [ ] **Excluye algunos plugins**: anotar cuáles, sus carpetas no viajarán a producción
- [ ] Desactiva el firewall renombrando su `.user.ini`

⚠️ **Lo que no se puede probar en staging:** estructura de URLs ni redirecciones 301. Se evalúan desde la raíz del dominio.

💡 En el contenido que reconstruyas, usa **URLs absolutas de producción**: funcionan el día del cambio y no dependen del search-replace.

---

## Fase 2 · Limpiar el clon

Desactivar **solo en la copia**:

- [ ] Caché (WP Super Cache, WP Rocket, LiteSpeed…)
- [ ] Firewall / seguridad (Wordfence…)
- [ ] Envío a buscadores (IndexNow)
- [ ] Optimizadores de imagen (Imagify, Smush…)
- [ ] Chat, píxeles, newsletters
- [ ] Comprobador de enlaces rotos
- [ ] Backups programados

⚠️ Si el plugin de seguridad ofrece **borrar sus tablas** al desactivarse, **di que no**: producción y staging comparten base de datos.

- [ ] ✅ Verificar que el **`noindex`** está activo en el clon

---

## Fase 3 · Inventario y clasificación

- [ ] Instalar y activar **AB Fusion Inventory**
- [ ] Herramientas → Inventario Fusion → **Resumen**: anotar el reparto simple / media / compleja
- [ ] Pestaña **Entorno Avada**: anotar CPT, claves de `postmeta` y opciones
- [ ] Exportar CSV

| Clase | Criterio |
|---|---|
| **SIMPLE** | Solo contenedores + `fusion_text`, columnas `1_1` |
| **MEDIA** | Elementos con equivalente HTML directo |
| **COMPLEJA** | Columnas fraccionadas o elementos sin equivalente |

- [ ] 🛑 **Decidir** qué contenidos proteger además de los COMPLEJOS, qué hacer con los borradores y con las páginas vacías

---

## Fase 4 · Rescatar lo que se pierde en silencio

### Logo y favicon

- [ ] 🚨 Buscar el logo en la biblioteca de medios: **Avada lo guarda en `fusion_options`, no en la identidad del sitio**
- [ ] 🛑 Conseguir un **favicon de 512 × 512 px como mínimo** (WordPress rechaza menos)

### Elementos globales

- [ ] Localizar cada `[fusion_global id="X"]` y ver qué contiene el CPT `fusion_element`
- [ ] Anotar qué contenidos los usan: al desactivar Avada se quedan en blanco
- [ ] Descartar los huérfanos (habitualmente la mayoría)

### Formularios y menú

- [ ] Comprobar si existe `fusion_form` y si ya hay Contact Form 7 conviviendo
- [ ] 🚨 Revisar `_menu_item_fusion_megamenu`: **si hay megamenú de Avada, la navegación hay que rehacerla**

---

## Fase 5 · Activar Astra

- [ ] Comprobar si hay **tema hijo** con código propio en `functions.php` → 🛑 si lo hay, hay que portarlo
- [ ] Instalar y activar **Astra**
- [ ] ✅ Si las páginas salen **en blanco** con cabecera y pie correctos → desactivar **Avada Core / Fusion Core**
- [ ] ✅ Comprobar que los **menús** siguen asignados
- [ ] ⚠️ **Dejar Avada Builder activo**: permite revertir y mantiene visible el contenido sin convertir

---

## Fase 6 · Conversión masiva

- [ ] Pestaña **Conversión** → «Añadir todas las COMPLEJAS» a la lista de exclusión
- [ ] Añadir los IDs que se hayan decidido proteger
- [ ] Elegir formato de salida: **HTML estándar** (editor clásico) o **bloques Gutenberg**
- [ ] **Simulacro (no escribe)** → ✅ debe dar **0 omitidas** y **0 residuos**
- [ ] 🛑 **Validar el simulacro** antes de escribir
- [ ] **Convertir de verdad** y confirmar

### ✅ Verificación obligatoria tras convertir

- [ ] Recuento: convertidas = simple + media · errores = 0
- [ ] 🚨 **Comprobar que las imágenes sobrevivieron.** El simulacro NO lo comprueba

```js
// En la consola del navegador, con sesión iniciada. Debe devolver cero.
const RE = /(^|\n|>)[ \t]*(https?:\/\/[^\s<"']+\.(?:jpg|jpeg|png|webp|gif))[ \t]*(?=\n|<|$)/gi;
for (const tipo of ['pages','posts']) {
  const r = await fetch(`/wp-json/wp/v2/${tipo}?per_page=100&context=edit&_fields=id,title,content`,
                        { credentials: 'same-origin' });
  (await r.json()).forEach(p => {
    const n = (p.content.raw.match(RE) || []).length;
    if (n) console.log(tipo, p.id, p.title.raw, '→', n);
  });
}
```

- [ ] Abrir 3-4 páginas en el frontal: encabezados, negritas, enlaces y shortcodes ajenos

---

## Fase 7 · Reconstruir los contenidos complejos

Por grupos, no uno a uno. Orden recomendado de menos a más trabajo:

- [ ] Contenidos que solo tienen `fusion_global` → volcar el elemento
- [ ] Contenidos con `fusion_youtube` → `<iframe>` responsive
- [ ] Contenidos con `fusion_blog` / `fusion_recent_posts` → bloque nativo de últimas entradas
- [ ] Contenidos con columnas fraccionadas → CSS grid o flex propio
- [ ] Elementos sueltos: `accordion`, `toggle`, `person`, `alert`, `modal_text_link`
- [ ] Landings que comparten plantilla: maquetar una y replicar
- [ ] **La portada, siempre la última**

⚠️ **Escribir por REST API, no por el editor.** Evita que los filtros del maquetador reprocesen el contenido y deja revisión automática para revertir.

💡 **Las columnas que solo servían de margen** (`1_5`, `1_6` vacías) se eliminan: el tema ya limita el ancho de lectura.

- [ ] ✅ Tras cada grupo: **exactamente un `<h1>`** por contenido

---

## Fase 8 · Desactivar Avada Builder

⚠️ No antes de terminar la fase 7.

- [ ] Desactivar **Avada Builder** y **Avada Core**
- [ ] ✅ Editar una entrada con el editor clásico **sin error crítico**
- [ ] ✅ Barrido final: **cero** contenidos con `[fusion_` en toda la web
- [ ] ⚠️ **No desinstalar Avada todavía**: mientras el tema siga instalado, la reversión es posible

---

## Fase 9 · Diseño con Astra

- [ ] 🛑 Conseguir **imagen de banner** apaisada, mínimo **2400 px** de ancho, tercio central despejado
- [ ] Ancho del sitio: **1240 px**
- [ ] Entradas, páginas y archivos: **contenedor de ancho normal** (el «estrecho» ignora la barra lateral sin avisar)
- [ ] Entradas: **barra lateral derecha** · Páginas y archivos: **sin barra lateral**
- [ ] Imagen destacada en entradas: **encima**, relación **original** (la predefinida amplía y desenfoca)
- [ ] Imagen destacada en páginas: **desactivada** si se usa banner de cabecera
- [ ] Fondo alterno de la paleta: sustituir el azul `#F0F5FA` por un gris neutro `#F1F2F4`
- [ ] Logo y favicon en Identidad del sitio
- [ ] Banner de cabecera en páginas y archivos
- [ ] Portada: hero propio con el **H1 dentro** + desactivar el área de título
- [ ] Pie de página: enlaces legales, redes sociales y aviso

⚠️ **Los SVG en línea en el editor de copyright del pie se sanitizan y desaparecen.** Hay que meterlos por CSS con `mask-image`.

⚠️ **Astra no ofrece imagen destacada por defecto**, ni con el módulo Blog Pro de Astra Pro. Se resuelve por CSS:

```css
.ast-article-post:not(.has-post-thumbnail) .ast-article-inner::before {
  content: ""; display: block; aspect-ratio: 16/9;
  background: url('IMAGEN') center/cover;
}
```

---

## Fase 10 · Verificación final antes de promover

- [ ] ✅ **Cero** contenidos con `[fusion_`
- [ ] ✅ Todas las páginas con **exactamente un `<h1>`**
- [ ] ✅ **Cero** URLs de imagen sueltas
- [ ] ✅ Formularios presentes y renderizados
- [ ] ✅ Menús, cabecera y pie completos
- [ ] ✅ Logo y favicon puestos
- [ ] ✅ Sin desbordamiento horizontal
- [ ] ✅ Móvil: menú, banner reducido, columnas apiladas
- [ ] 🛑 **Revisión visual del cliente**

---

## Fase 11 · Paso a producción

> Método de renombrado de carpetas. Producción y clon comparten base de datos con prefijos distintos: el cambio es de **carpetas** + **`wp-config.php`** + **search-replace**.

### Antes

- [ ] **Backup completo**: base de datos y ambas carpetas
- [ ] Resolver el **delta** de contenido publicado desde el clonado
- [ ] Purgar y desactivar cachés
- [ ] **Desactivar WP Staging** en el clon
- [ ] Franja de bajo tráfico

### El cambio

- [ ] `{prod}` → `{prod}_old`
- [ ] `{staging}` → `{prod}`

### `wp-config.php` — inmediatamente

- [ ] `WP_HOME` y `WP_SITEURL` al dominio real
- [ ] **Borrar** `define( 'WPSTAGING_DEV_SITE', true );`
- [ ] `WP_ENVIRONMENT_TYPE` → `'production'`
- [ ] Quitar `DISALLOW_FILE_MODS` si está en `true`
- [ ] ⚠️ **NO tocar `$table_prefix`**: el del clon es el bueno
- [ ] 🚨 **Sin `?>` final ni líneas en blanco al final del archivo**

> Un solo `\n` sobrante rompe `setcookie()` y `wp_redirect()`. Síntoma: «las cookies se han bloqueado debido a un resultado inesperado» y `wp-admin` en blanco de 1 byte.

### `.htaccess`

- [ ] Reescribir **a mano** el bloque de WordPress con `RewriteBase /` (guardar permalinks no basta en PHP CGI/FPM)
- [ ] Borrar bloques `# BEGIN Wordfence WAF` con rutas del staging
- [ ] Renombrar a `.bak` los `.user.ini` / `php.ini` con `auto_prepend_file` antiguo

### `uploads`

```bash
cp -rn {prod}_old/wp-content/uploads/. {prod}/wp-content/uploads/
```

⚠️ **Fusión, nunca reemplazo.** Y con `-n`: sin él, una imagen resubida vuelve a la versión antigua sin avisar.

### Search-replace

- [ ] Dry-run: `https://dominio.com/{staging}` → `https://dominio.com`
- [ ] Ejecutar sobre **todas las tablas** del prefijo bueno
- [ ] 🚨 **Segunda pasada con `http://`**: los enlaces antiguos no los captura la búsqueda de `https://`
- [ ] ⚠️ Mantener marcada la opción de **objetos serializados**
- [ ] Revisar el **CSS adicional**: las imágenes de fondo llevan la ruta del staging

---

## Fase 12 · Verificaciones que no se pueden olvidar

- [ ] 🚨 **Quitar el `noindex`.** *El olvido más caro de toda la migración*
- [ ] Comprobar que `/robots.txt` no dice `Disallow: /`
- [ ] 🚨 **Guardar los enlaces permanentes**
- [ ] 🚨 **Reinstalar los plugins excluidos del clon**
- [ ] Reactivar firewall, caché y optimizadores
- [ ] Borrar cookies del dominio y comprobar en **incógnito** (las 301 quedan cacheadas en Chrome)
- [ ] Buscar `/{staging}` en el código fuente → **cero**
- [ ] **Enviar un formulario real** y comprobar que llega el correo
- [ ] Probar 4-5 **redirecciones 301**

---

## Fase 13 · Limpieza posterior

- [ ] Dejar `{prod}_old` unos días como red de seguridad
- [ ] Vigilar **Search Console** las primeras semanas
- [ ] Borrar el juego de tablas antiguas ⚠️ **confirmar el prefijo**
- [ ] 🚨 **No usar el botón «Borrar» de WP Staging** sobre el sitio antiguo: comparten base de datos

### Residuos de Avada en base de datos

| Residuo | Volumen típico |
|---|---|
| `_transient_fusion_dynamic_css_*` | ~1,2 MB cada uno |
| `_transient_fusion_tos` / `_tos_flat` | ~500 KB cada uno |
| `_fusion` | 1 por contenido maquetado |
| `avada_post_views_count` | 1 por entrada |
| `fusion_builder_status` · `fusion_builder_converted` | cientos |
| `pyre_*` · `_fusion_google_fonts` · `_menu_item_fusion_megamenu` | decenas |
| CPT huérfanos: `fusion_element`, `fusion_template`, `slide` | pocos |

- [ ] 💡 **`fusion_builder_content_backup` se borra el último**: es la copia del contenido previo que hizo el propio Avada
- [ ] Desinstalar Avada, Avada Builder, Avada Core y WP Staging

---

## Los cuatro olvidos que se pagan caros

1. **El `noindex`** puesto tras promover
2. **Los enlaces permanentes** sin guardar
3. **Los plugins excluidos** sin reinstalar
4. **`uploads` reemplazado** en vez de fusionado con `cp -rn`

---

*Elaborado por [Auditour](https://auditour.eu) a partir de tres migraciones reales de Avada a Astra. Se ofrece tal cual, sin garantía. Haz copia de seguridad antes de cada fase.*
