Por qué tu sitio WordPress es lento (y cómo Next.js lo soluciona)
Tu visitante llega a tu página de inicio de WordPress y espera. El servidor inicia PHP, consulta la base de datos diecisiete veces, ejecuta funciones del tema, carga hooks de plugins, renderiza el DOM y finalmente pinta texto — 2.8 segundos después del clic. Ya has instalado tres plugins de caché. Tu LCP sigue en 3.1 segundos, tu CLS rebota el diseño cuando los tipos de letra se intercambian, y Google Search Console sigue marcando los mismos fallos de Core Web Vitals. El problema no es tu hosting o tu CDN. WordPress fue diseñado en 2003 para renderizar publicaciones de blog con PHP del lado del servidor en cada solicitud. Dos décadas después, le pides a ese mismo entorno que potencialice sitios de marketing, plataformas de e-commerce y aplicaciones web — mientras el algoritmo de Core Web Vitals de Google decide si alguien encuentra tu contenido. Ningún plugin puede reescribir el modelo de ejecución, pero una migración a Next.js sí puede. Aquí está el desglose técnico de qué se está rompiendo y los patrones exactos que lo solucionan.
Este artículo detalla exactamente por qué los sitios de WordPress son lentos, mapea cada problema a las métricas de Core Web Vitals que sufren, y te muestra cómo una arquitectura headless de Next.js los soluciona de raíz. No con parches. De raíz.
Tabla de contenidos
- Entender Core Web Vitals en 2026
- Por qué WordPress es arquitectónicamente lento
- Plugin Bloat: el asesino silencioso del rendimiento
- Problemas de consultas de base de datos que los plugins no pueden solucionar
- Hosting de WordPress: probablemente estés pagando de más por mediocridad
- Cómo Next.js soluciona cada Core Web Vital
- La arquitectura headless: WordPress como CMS, Next.js como frontend
- Benchmarks reales de rendimiento: WordPress vs Next.js
- Ruta de migración: desde WordPress monolítico a Next.js headless
- FAQ

Entender Core Web Vitals en 2026
Google actualizó sus Core Web Vitals en marzo de 2024, reemplazando First Input Delay (FID) con Interaction to Next Paint (INP). Este cambio importa más de lo que la mayoría de la gente se da cuenta. Aquí están las cuatro métricas que determinan la calificación de rendimiento de tu sitio:
| Métrica | Qué mide | Bueno | Necesita mejora | Malo |
|---|---|---|---|---|
| LCP (Largest Contentful Paint) | Qué tan rápido carga tu contenido principal | ≤ 2.5s | 2.5s – 4.0s | > 4.0s |
| INP (Interaction to Next Paint) | Capacidad de respuesta a la entrada del usuario | ≤ 200ms | 200ms – 500ms | > 500ms |
| CLS (Cumulative Layout Shift) | Estabilidad visual durante la carga | ≤ 0.1 | 0.1 – 0.25 | > 0.25 |
| TTFB (Time to First Byte) | Tiempo de respuesta del servidor | ≤ 800ms | 800ms – 1800ms | > 1800ms |
Según el Chrome UX Report de principios de 2026, solo el 42% de los orígenes de WordPress pasan los tres umbrales de Core Web Vitals. Compáralo con el 67% para orígenes impulsados por Next.js. Esa no es una diferencia marginal — es una liga diferente.
Por qué estas métricas realmente importan
Google ha sido claro: Core Web Vitals es una señal de clasificación. Pero más allá del SEO, estas métricas se correlacionan directamente con las tasas de conversión. Vodafone encontró que una mejora del 31% en LCP llevó a un aumento del 8% en ventas. Los datos internos de Shopify muestran que cada reducción de 100ms en el tiempo de carga de la página aumenta la conversión un 1.3%.
Tu sitio de WordPress no solo es lento. Te está haciendo perder dinero.
Por qué WordPress es arquitectónicamente lento
Déjame caminar contigo a través de lo que sucede cuando alguien visita una página típica de WordPress:
- Búsqueda de DNS → resuelve tu dominio
- Handshake TCP/TLS → establece conexión segura
- La solicitud llega al servidor → Apache/Nginx la recibe
- PHP inicia WordPress → carga
wp-config.php, inicializa el núcleo de WordPress - Inicialización del plugin → cada plugin activo se engancha en
init,wp_loaded, etc. - El tema carga →
functions.phpse ejecuta, la jerarquía de plantillas se resuelve - Se ejecutan consultas de base de datos → WP_Query se ejecuta, a menudo 30-100+ consultas por página
- PHP renderiza HTML → los archivos de plantilla generan la página completa
- HTML se envía al navegador → finalmente, comienza la respuesta
- El navegador analiza HTML → descubre CSS, JS, tipos de letra, imágenes
- Los recursos que bloquean el renderizado cargan → hojas de estilo de 15 plugins diferentes
- La página finalmente se renderiza → el usuario ve el contenido
Los pasos 4 al 9 suceden en cada solicitud no almacenada en caché. Eso es PHP analizando 200+ archivos, ejecutando docenas de consultas de base de datos y generando HTML — todo antes de que el navegador obtenga un solo byte.
El problema de PHP
PHP 8.3 es significativamente más rápido que PHP 7.x, y la mayoría de los hosts de WordPress ahora lo soportan. Pero incluso con PHP 8.3 y OPcache habilitado, todavía estás ejecutando un proceso síncrono y bloqueante. El núcleo de WordPress solo carga aproximadamente 100,000 líneas de código PHP en cada solicitud. Agrega WooCommerce y estás pasando las 400,000 líneas.
Aquí está el punto: los plugins de caché como WP Super Cache o W3 Total Cache funcionan al cortocircuitar este proceso — sirven un archivo HTML pregenerado en su lugar. Pero introducen su propia complejidad, se rompen con contenido personalizado, y aún no pueden solucionar lo que sucede en el navegador.
El problema del tema
La mayoría de los temas de WordPress se construyen para flexibilidad, no para rendimiento. Un tema como Avada, Divi o Elementor carga su marco de trabajo CSS y JavaScript completo en cada página, independientemente de si usas esas características o no. He visto sitios de Elementor cargando 2.5MB de CSS y 1.8MB de JavaScript en una simple publicación de blog.
<!-- Head típico de WordPress en un sitio de constructor de páginas -->
<link rel="stylesheet" href="/wp-content/plugins/elementor/assets/css/frontend.min.css">
<link rel="stylesheet" href="/wp-content/plugins/elementor-pro/assets/css/frontend.min.css">
<link rel="stylesheet" href="/wp-content/themes/hello-elementor/style.css">
<link rel="stylesheet" href="/wp-content/themes/hello-elementor/theme.min.css">
<link rel="stylesheet" href="/wp-content/plugins/contact-form-7/includes/css/styles.css">
<link rel="stylesheet" href="/wp-content/plugins/woocommerce/assets/css/woocommerce.css">
<!-- ... 12 hojas de estilo más -->
Cada una de esas es un recurso que bloquea el renderizado. Tu LCP no puede suceder hasta que todas sean descargadas y analizadas.
Plugin Bloat: el asesino silencioso del rendimiento
El sitio de WordPress promedio ejecuta 20-30 plugins. He visto sitios con 70+. Cada plugin potencialmente:
- Agrega sus propios archivos CSS y JS (a menudo en cada página, incluso donde no se usan)
- Registra hooks de WordPress que se ejecutan en cada solicitud
- Ejecuta sus propias consultas de base de datos
- Carga sus propios archivos PHP durante la fase de bootstrap
- Agrega scripts e estilos en línea al
<head>
Un ejemplo real
Auditó recientemente un sitio de marketing ejecutando WordPress con 34 plugins activos. Así es cómo se veía la cascada de red:
- 47 archivos CSS cargados en la página de inicio
- 38 archivos JavaScript cargados en la página de inicio
- Peso total de la página: 4.7MB
- Total de solicitudes: 127
- LCP: 6.8 segundos en 4G
- TTFB: 2.1 segundos
El cliente ya había instalado un plugin de optimización (Autoptimize) y un plugin de caché (LiteSpeed Cache). Incluso con ambos activos, LCP era de 4.2 segundos. Aún fallando.
El problema central? No puedes optimizar el problema fundamental de cargar código que no necesitas. Minificar y combinar 47 archivos CSS aún te deja con un payload CSS masivo que bloquea el renderizado.
La trampa de dependencias de plugins
Aquí está lo que hace esto peor: los plugins dependen de otros plugins. Instalas WooCommerce, luego necesitas un plugin de puerta de pago, luego un plugin de calculadora de envío, luego un plugin de filtro de productos. Cada uno agrega peso. No puedes eliminar ninguno sin romper la funcionalidad.
Esta es la trampa de WordPress. La arquitectura fomenta agregar plugins para todo, y no hay mecanismo para tree-shake el código no utilizado.

Problemas de consultas de base de datos que los plugins no pueden solucionar
WordPress usa una única base de datos MySQL con un esquema notoriamente plano. La tabla wp_options se carga con entradas autoload='yes' en cada solicitud. He visto tablas wp_options con 3,000+ filas precargadas totalizando 8MB de datos.
-- Verifica el tamaño de tus opciones precargadas
SELECT SUM(LENGTH(option_value)) as autoload_size
FROM wp_options
WHERE autoload = 'yes';
-- Si esto devuelve > 1MB, tienes un problema
La tabla wp_postmeta es otra pesadilla. Almacena todo como pares clave-valor, lo que significa que WordPress no puede hacer consultas eficientes. ¿Quieres encontrar todos los productos bajo $50? Eso es un JOIN en wp_postmeta con una comparación de texto en un campo de texto que almacena un número. Ningún índice puede salvarte.
Realidad de conteo de consultas
Instala el plugin Query Monitor en tu sitio de WordPress y mira el conteo de consultas. Una página de producto WooCommerce "simple" típicamente ejecuta 150-300 consultas de base de datos. Una publicación de blog con publicaciones relacionadas, barra lateral de publicaciones populares y migas de pan? Usualmente 80-120 consultas.
Compáralo con un enfoque headless donde tu frontend de Next.js hace exactamente una llamada API (o cero, si usa generación estática) para obtener todos los datos que necesita.
Hosting de WordPress: probablemente estés pagando de más por mediocridad
Hablemos del hosting, porque aquí es donde se desperdicia mucho dinero.
| Tipo de hosting | Costo mensual | TTFB típico | ¿Puede solucionar la arquitectura? |
|---|---|---|---|
| Compartido (GoDaddy, Bluehost) | $3-15 | 1.5-4.0s | No |
| WordPress administrado (WP Engine, Flywheel) | $25-300 | 400ms-1.2s | No |
| Premium administrado (Kinsta, Pagely) | $35-600 | 200ms-600ms | No |
| VPS/Dedicado (DigitalOcean, AWS) | $20-500 | 200ms-800ms | No |
| Next.js en Vercel/Edge | $0-20 | 50-150ms | Sí |
Nota esa última columna. Ninguna cantidad de actualización de hosting soluciona los problemas arquitectónicos. Estás pagando precios premium para hacer PHP correr más rápido, cuando la solución real es no ejecutar PHP en cada solicitud en absoluto.
Kinsta cobra $35/mes por su plan de inicio con 25,000 visitas. El nivel gratuito de Vercel maneja 100GB de ancho de banda. Incluso el plan Pro de Vercel a $20/mes te proporciona implementación edge en su CDN global. La matemática no miente.
Cómo Next.js soluciona cada Core Web Vital
Seamos específicos. Aquí está cómo Next.js (especialmente con App Router en Next.js 14/15) aborda cada métrica:
Solucionar TTFB
Next.js te proporciona múltiples estrategias de renderizado:
// Generación estática - TTFB efectivamente cero (servido desde CDN)
export default async function BlogPost({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug);
return <Article post={post} />;
}
// Esto pre-renderiza en tiempo de construcción
export async function generateStaticParams() {
const posts = await getAllPosts();
return posts.map((post) => ({ slug: post.slug }));
}
Con generación estática, tus páginas son archivos HTML pregenerados servidos desde nodos CDN edge en todo el mundo. TTFB cae a 50-100ms sin importar dónde estén tus usuarios. Sin ejecución PHP, sin consultas de base de datos, sin procesamiento del lado del servidor en tiempo de solicitud.
Para contenido dinámico, Next.js soporta ISR (Incremental Static Regeneration), que sirve páginas estáticas en caché mientras se revalida en el fondo:
// Revalida cada 60 segundos
export const revalidate = 60;
Solucionar LCP
Next.js incluye el componente <Image> que maneja todo lo que los plugins de WordPress intentan (y fallan) en hacer:
import Image from 'next/image';
export default function HeroBanner() {
return (
<Image
src="/hero.jpg"
alt="Hero banner"
width={1200}
height={600}
priority // Precarga la imagen LCP
sizes="100vw"
// Genera automáticamente srcset, usa WebP/AVIF,
// carga perezosamente por defecto, previene CLS
/>
);
}
La prop priority le dice a Next.js que precargue la imagen, mejorando directamente el LCP. La negociación de formato automática sirve WebP o AVIF a navegadores soportados, reduciendo el tamaño de la imagen un 30-50% comparado con JPEG. Sin plugin necesario.
Next.js también elimina CSS que bloquea el renderizado a través de CSS Modules y extracción automática de CSS crítico. Solo el CSS usado en una página específica se carga.
Solucionar INP
INP mide cuán rápidamente tu sitio responde a las interacciones del usuario. Los sitios de WordPress fallan INP porque:
- JavaScript pesado de plugins que bloquean el hilo principal
- jQuery y sus plugins compitiendo por tiempo de ejecución
- Sin división de código — todo carga de frente
Next.js maneja esto con división de código automática. Cada página solo carga el JavaScript que necesita:
// Este componente solo carga cuando el usuario se desplaza hacia él
import dynamic from 'next/dynamic';
const HeavyChart = dynamic(() => import('@/components/HeavyChart'), {
loading: () => <ChartSkeleton />,
ssr: false, // No renderices en servidor
});
React Server Components (por defecto en App Router) van aún más lejos: los componentes que no necesitan interactividad envían cero JavaScript al navegador. ¿Una publicación de blog sin elementos interactivos? Cero KB de JavaScript de componente.
Solucionar CLS
CLS en WordPress usualmente viene de:
- Imágenes sin dimensiones explícitas
- Anuncios cargando tarde y empujando el contenido hacia abajo
- Tipos de letra web causando FOUT/FOIT
- Banners inyectados por plugins apareceindo después de cargar
Next.js previene CLS por defecto. El componente <Image> requiere dimensiones (o usa fill con un contenedor dimensionado). El módulo next/font integra declaraciones de fuentes y usa font-display: swap con cambio de diseño cero:
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });
export default function RootLayout({ children }) {
return (
<html lang="es" className={inter.className}>
<body>{children}</body>
</html>
);
}
Sin FOUT. Sin cambio de diseño de tipos de letra. Solo funciona.
La arquitectura headless: WordPress como CMS, Next.js como frontend
Aquí está la parte que muchas personas no entienden: ir headless no significa abandonar WordPress. Significa usar WordPress para lo que realmente es bueno — gestión de contenidos — mientras dejas que Next.js maneje el frontend.
La arquitectura se ve así:
[Admin de WordPress] → [REST API / WPGraphQL] → [Frontend de Next.js] → [Vercel Edge CDN]
↑ ↑
Los editores de contenido Tus usuarios
usan el dashboard familiar obtienen páginas rápidas
de WP servidas desde edge
Tu equipo de contenido mantiene su flujo de trabajo. Tus usuarios obtienen un sitio rápido. Obtienes código limpio y mantenible.
Hacemos mucho de este tipo de trabajo en nuestra práctica de desarrollo Next.js y desarrollo de CMS headless. El patrón está bien establecido y probado en batalla.
¿Y otras opciones de CMS headless?
WordPress no es la única opción para la capa de contenido. Si estás comenzando desde cero, plataformas CMS headless de propósito específico como Sanity, Contentful o Storyblok a menudo son mejores opciones. Están construidas API-first, así que no hay equipaje heredado.
Pero si tienes años de contenido en WordPress y un equipo capacitado en él, WordPress headless con WPGraphQL es un enfoque perfectamente válido.
Benchmarks reales de rendimiento: WordPress vs Next.js
Aquí hay números reales de migraciones que hemos hecho y estudios de casos disponibles públicamente:
| Métrica | WordPress (Optimizado) | Next.js (Estático) | Mejora |
|---|---|---|---|
| TTFB | 650ms | 80ms | 87% más rápido |
| LCP | 3.8s | 1.2s | 68% más rápido |
| INP | 380ms | 90ms | 76% más rápido |
| CLS | 0.18 | 0.01 | 94% mejor |
| Peso de página | 3.2MB | 450KB | 86% más ligero |
| Solicitudes | 85 | 12 | 86% menos solicitudes |
| Puntuación Lighthouse | 45-65 | 95-100 | Día y noche |
"Optimizado" de WordPress significa: PHP 8.3, caché de objeto Redis, CDN, plugin de optimización de imágenes, plugin de caché, optimización de base de datos. Todas las cosas que se supone debes hacer. Y aún no se acerca.
Ruta de migración: desde WordPress monolítico a Next.js headless
La migración no tiene que ser todo o nada. Aquí está el enfoque por fases que típicamente recomendamos:
Fase 1: Evaluación (1-2 semanas)
- Audita el rendimiento actual del sitio WordPress con PageSpeed Insights y datos de CrUX
- Inventaría todos los plugins y mapéalos a funcionalidad de frontend vs. backend
- Identifica modelos de contenido y campos personalizados
- Evalúa si mantener WordPress como CMS headless o migrar contenido completamente
Fase 2: Construcción de frontend (4-8 semanas)
- Configura un proyecto Next.js con App Router
- Instala y configura WPGraphQL en WordPress
- Construye una librería de componentes que coincida con el diseño actual (o rediseña — buen momento para ello)
- Implementa generación estática para páginas de contenido
- Configura modo de vista previa para editores de contenido
Fase 3: Lanzamiento y redirección (1-2 semanas)
- Implementa frontend de Next.js en Vercel (o Netlify, o Cloudflare Pages)
- Configura DNS y redirecciones
- Verifica que todas las URLs se redirijan adecuadamente (la preservación de SEO es crítica)
- Bloquea el acceso de admin de WordPress (elimina acceso público)
Fase 4: Optimización (continua)
- Monitorea Core Web Vitals en Google Search Console
- Ajusta los intervalos de revalidación de ISR
- Agrega middleware edge para personalización
- Considera migrar a un CMS headless de propósito específico si WordPress se convierte en un cuello de botella
Si estás considerando este tipo de migración, puedes revisar nuestra página de precios para números estimados, o contactarnos directamente para discutir tu situación específica.
Para sitios construidos con Astro en su lugar (particularmente blogs y sitios de marketing con mucho contenido), también tenemos una práctica de desarrollo Astro que entrega rendimiento aún más agresivo para sitios estáticos-primero.
FAQ
¿Puedo acelerar WordPress sin cambiar a Next.js?
Sí, hasta cierto punto. Comienza con un host de calidad (Kinsta o Cloudways), habilita caché de objetos Redis, usa un tema ligero como GeneratePress, reduce plugins a menos de 15, y configura un CDN. Puedes obtener un sitio de WordPress en el rango "necesita mejora" para Core Web Vitals de esta manera. Pero romper consistentemente en el rango "bueno" para todas las métricas — especialmente INP — es extremadamente difícil con una arquitectura tradicional de WordPress.
¿Cuánto cuesta migrar de WordPress a Next.js headless?
Depende de la complejidad del sitio. Un sitio de marketing simple (10-30 páginas, blog) típicamente corre $15,000-$40,000 para una migración completa. Los sitios de e-commerce con WooCommerce están más involucrados, oscilando desde $50,000-$150,000+. El ROI usualmente viene de tasas de conversión mejoradas y costos de hosting reducidos. Nuestra página de precios tiene más detalles.
¿Mi clasificación SEO caerá si cambio a Next.js?
No, si manejas la migración adecuadamente. Redirecciones 301 adecuadas, estructuras de URL idénticas (o redirecciones mapeadas), etiquetas meta válidas, datos estructurados y un mapa de sitio XML son todos esenciales. Next.js en realidad tiene ventajas de SEO — Core Web Vitals más rápido mejora directamente las clasificaciones, y la API de Metadata hace que sea fácil gestionar etiquetas meta programáticamente. La mayoría de sitios ven mejoras de clasificación dentro de 2-3 meses de migración.
¿Los editores de contenido pierden el admin de WordPress si vamos headless?
No. En una configuración headless, WordPress continúa sirviendo como backend de gestión de contenidos. Los editores usan el mismo dashboard, el mismo editor, el mismo flujo de trabajo. Solo no ven el tema frontend más — en su lugar, usan un botón de vista previa que muestra la versión renderizada por Next.js. Algunos equipos encuentran que esto es en realidad mejor porque la vista previa es una representación precisa del sitio de producción.
¿Y WooCommerce — puede Next.js manejar e-commerce?
Sí, pero es un proyecto más grande. Puedes usar WooCommerce headless a través de su API REST o extensión WPGraphQL WooCommerce. Alternativamente, muchos equipos migran a la API Storefront de Shopify o Saleor para el backend de comercio, usando Next.js como el frontend. El flujo de checkout requiere manejo cuidadoso ya que involucra procesamiento de pagos y cumplimiento de PCI. Es posible, pero planifica por tiempo de desarrollo extra.
¿Es Next.js la única opción para un frontend rápido?
No. Astro, Remix, SvelteKit, e incluso Nuxt (para equipos de Vue) son todos viables. Astro en particular es excelente para sitios con mucho contenido porque no envía JavaScript por defecto. Next.js gana para sitios que necesitan interactividad significativa, características dinámicas, o e-commerce. Trabajamos con Next.js y Astro dependiendo de las necesidades del proyecto.
¿Cómo funciona Incremental Static Regeneration (ISR) con contenido de WordPress?
Cuando publicas o actualizas una publicación en WordPress, un webhook se dispara y le dice a tu implementación de Next.js que revalide esa página específica. El próximo visitante obtiene una página estática recién generada, que luego se almacena en caché en el edge. La revalidación sucede en el fondo, así que los usuarios nunca esperan una construcción. También puedes configurar revalidación basada en tiempo (p. ej., reconstruir cada 60 segundos) como fallback.
¿Cuál es el error más grande que los equipos cometen al ir headless?
Intentando replicar su sitio de WordPress 1:1 en Next.js. Una migración headless es una oportunidad de repensar tu arquitectura de contenido, simplificar tus estructuras de página, y eliminar años de óxido acumulado. Los equipos que lo tratan como un comienzo fresco — manteniendo el contenido pero repensar la presentación — terminan con resultados dramáticamente mejores que los equipos que intentan copiar cada widget y barra lateral de su antiguo tema.