Por qué migré de WordPress a Astro
Después de 4 años con WordPress + Elementor, mi sitio pesaba más de 3 MB por página, cargaba en 4-5 segundos y me costaba 25€/mes de hosting solo para mantenerlo vivo. La puntuación de Lighthouse era un triste 45 en móvil.
No era culpa de WordPress en sí — era la acumulación de plugins (19 activos), un tema pesado, Elementor con su CSS inline, y un servidor compartido que hacía lo que podía. La situación es común: el 40% de los sitios WordPress no pasan los Core Web Vitals.
Decidí migrar a Astro cuando vi que podía obtener un 100/100 en Lighthouse generando HTML estático, sin servidor, sin plugins, sin mantenimiento de seguridad, y con hosting gratuito en Vercel.
Los resultados tras la migración:
| Métrica | WordPress | Astro |
|---|---|---|
| Lighthouse Performance | 45 | 100 |
| LCP | 4.2s | 0.8s |
| Peso por página | 3.1 MB | 85 KB |
| Hosting mensual | 25€ | 0€ |
| Plugins activos | 19 | 0 |
| Tiempo de build | N/A | 7s (220 páginas) |
Paso 1: Auditar el contenido de WordPress
Antes de tocar nada, necesitas saber exactamente qué tienes:
- Lista de todas las URLs: usa Screaming Frog (gratuito hasta 500 URLs) o el sitemap de Yoast para exportar todas las URLs indexadas
- Contenido que migra: páginas, posts, categorías, imágenes
- Contenido que NO migra: comentarios, shortcodes de plugins, formularios dinámicos
- Funcionalidades a replicar: formulario de contacto, buscador, multiidioma
En mi caso tenía 15 páginas, 8 posts de blog, 3 formularios de contacto y multiidioma (es/en). Guardé todo en una hoja de cálculo con las URLs antiguas y las nuevas.
Paso 2: Exportar contenido a Markdown
WordPress almacena el contenido en HTML dentro de su base de datos. Necesitas convertirlo a Markdown para Astro.
Hay varias opciones:
Opción A: Plugin wordpress-export-to-markdown
npx wordpress-export-to-markdown --wizard
Este CLI de Node toma tu export XML de WordPress (wp-admin → Herramientas → Exportar) y genera archivos .md con frontmatter. Es la opción más limpia.
Opción B: Manual con wp-admin
Si tienes pocos posts (como yo), copiar el contenido manualmente y formatearlo en Markdown puede ser más rápido y limpio. Aprovechas para editar y mejorar el contenido.
Opción C: Script custom
Para sitios grandes, un script que conecte a la REST API de WordPress y genere Markdown:
// export-wp.mjs
const WP_URL = 'https://tu-sitio.com/wp-json/wp/v2';
const posts = await fetch(`${WP_URL}/posts?per_page=100`).then(r => r.json());
for (const post of posts) {
const frontmatter = `---
title: "${post.title.rendered}"
date: ${post.date.split('T')[0]}
description: "${post.excerpt.rendered.replace(/<[^>]*>/g, '').trim()}"
---`;
// Necesitarás una librería como turndown para HTML → Markdown
console.log(`${frontmatter}\n\n${post.content.rendered}`);
}
Las trampas del contenido de Elementor
Si usabas Elementor, el HTML exportado es un desastre de divs anidados con clases propias. No intentes convertirlo automáticamente — reescribe el contenido a mano. Sí, lleva más tiempo, pero el resultado es contenido limpio y mantenible.
Shortcodes como [contact-form-7 id="123"] no se traducen a Markdown. Necesitas reemplazarlos con componentes Astro o HTML.
Paso 3: Recrear la estructura en Astro
Con el contenido exportado, crea tu proyecto Astro:
npm create astro@latest mi-sitio
cd mi-sitio
npm install
Coloca los archivos Markdown en src/content/blog/ y crea tu Content Collection en src/content/config.ts.
Tip clave: si puedes, mantén exactamente la misma estructura de URLs. Si tu blog en WordPress estaba en /blog/mi-post/, ponlo en /blog/mi-post/ en Astro. Cada URL que cambias es una redirección que necesitas configurar.
En mi caso, aproveché la migración para reestructurar las URLs (de /es/blog/ a /es/blog/slug/ con slugs limpios), lo que significó más redirecciones pero URLs más limpias.
Paso 4: Configurar redirecciones 301
Esto es lo más crítico de toda la migración. Si no rediriges las URLs antiguas a las nuevas, perderás todo el SEO acumulado. Google verá las URLs antiguas como 404 y dejará de mostrarlas.
Para hosting con .htaccess (Apache)
# .htaccess — Redirecciones de WordPress a Astro
RewriteEngine On
# Posts de blog
Redirect 301 /2024/03/como-elegir-tecnologia/ /es/blog/como-elegir-tecnologia-web/
Redirect 301 /2024/02/seo-programatico/ /es/blog/seo-programatico-guia/
# Páginas
Redirect 301 /servicios/desarrollo-web/ /es/servicios/desarrollo-web/
Redirect 301 /contacto/ /es/contacto/
# Categorías y tags (redirigir al blog index)
RedirectMatch 301 ^/category/(.*)$ /es/blog/
RedirectMatch 301 ^/tag/(.*)$ /es/blog/
# Feed RSS
Redirect 301 /feed/ /es/blog/
Para Vercel/Netlify
Archivo vercel.json en la raíz:
{
"redirects": [
{ "source": "/2024/03/como-elegir-tecnologia/", "destination": "/es/blog/como-elegir-tecnologia-web/", "permanent": true },
{ "source": "/contacto/", "destination": "/es/contacto/", "permanent": true }
]
}
Verifica con Screaming Frog
Después de subir las redirecciones, escanea todas las URLs antiguas con Screaming Frog para confirmar que cada una devuelve un 301 → URL nueva → 200. Si alguna devuelve 404, arréglala inmediatamente.
Paso 5: Resolver formularios de contacto
WordPress tiene Contact Form 7, WPForms, Gravity Forms… Astro no tiene nada de esto por defecto. Opciones:
- Formspree: servicio externo, plan gratuito hasta 50 envíos/mes. Añades un
actional<form>y listo - Netlify Forms: si hosteas en Netlify, los formularios nativos son gratuitos
- API propia: un endpoint en Supabase, un Edge Function de Vercel, o un Worker de Cloudflare
- WhatsApp redirect: lo que hago en crisartigas.com — construyo la URL de WhatsApp con los datos del formulario. Sin backend necesario
Paso 6: Verificar en Google Search Console
Después de la migración:
- Verifica el nuevo sitio en Search Console (si cambió de dominio o protocolo)
- Envía el nuevo sitemap:
tu-sitio.com/sitemap-index.xml - Usa la herramienta de inspección de URLs para verificar que las páginas principales se indexan correctamente
- Monitorea el informe de cobertura durante las siguientes 4-6 semanas — busca errores 404 que se te hayan escapado
Es normal ver una caída temporal de impresiones/clics durante 1-2 semanas mientras Google procesa las redirecciones. Si después de 4 semanas sigue bajando, revisa las redirecciones y el contenido.
Timeline realista
Para un sitio de 15-30 páginas como el mío:
- Semana 1: Auditoría, exportación de contenido, setup de Astro
- Semana 2-3: Desarrollo del sitio en Astro (diseño, componentes, contenido)
- Semana 4: Redirecciones, testing, formularios, SEO verification
- Semana 5: Lanzamiento y monitoreo
Total: 4-5 semanas trabajando a media jornada en paralelo con otros proyectos.
¿Merece la pena?
Sin duda. El resultado es un sitio que carga 10x más rápido, cuesta 0€ de hosting, no necesita actualizaciones de seguridad, y me da control total sobre cada línea de código. El SEO no solo se mantuvo — mejoró gracias al rendimiento superior.
Pero no es para todos. Si tu equipo de contenido necesita un editor visual, si dependes de plugins de WordPress para funcionalidades complejas, o si no tienes capacidad técnica para mantener un sitio Astro, quédate con WordPress. La mejor tecnología es la que tu equipo puede mantener.