Por qué tu sitio WordPress es lento y cómo Next.js lo soluciona
Traduce el siguiente artículo markdown al español.
He auditado cientos de sitios WordPress a lo largo de los años, y la conversación generalmente comienza de la misma manera: "Instalamos un plugin de caché pero nuestras puntuaciones siguen siendo terribles". La verdad que nadie en el ecosistema de WordPress quiere admitir es que la mayoría de los problemas de rendimiento no se pueden solucionar con plugins. Son arquitectónicos. WordPress fue construido en 2003 para renderizar publicaciones de blog con PHP. Es 2025, y le estamos pidiendo que impulse sitios de marketing complejos, plataformas de comercio electrónico y aplicaciones web, todo mientras los Core Web Vitals de Google determinan cada vez más si alguien realmente encuentra tu contenido.
Este artículo explica exactamente por qué los sitios de WordPress son lentos, mapea cada problema con las métricas de Core Web Vitals que sufren, y te muestra cómo una arquitectura headless con Next.js los soluciona de raíz. No con parches. De raíz.
Tabla de contenidos
- Comprender Core Web Vitals en 2025
- 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 de rendimiento reales: WordPress vs Next.js
- Ruta de migración: De WordPress monolítico a headless Next.js
- Preguntas frecuentes

Comprender Core Web Vitals en 2025
Google actualizó sus Core Web Vitals en marzo de 2024, reemplazando First Input Delay (FID) con Interaction to Next Paint (INP). Este cambio es más importante de lo que la mayoría de la gente cree. Aquí hay cuatro métricas que determinan la calificación de rendimiento de tu sitio:
| Métrica | Qué mide | Bueno | Necesita mejora | Pobre |
|---|---|---|---|---|
| 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 2025, solo el 42% de los orígenes de WordPress aprueban todos los umbrales de Core Web Vitals. Compáralo con el 67% para los orígenes impulsados por Next.js. 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 condujo a un aumento del 8% en las 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 en 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 recorrer lo que sucede cuando alguien visita una página típica de WordPress:
- Búsqueda DNS → resuelve tu dominio
- Apretón de manos 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 de plugins → cada plugin activo se engancha a
init,wp_loaded, etc. - El tema se carga →
functions.phpse ejecuta, la jerarquía de plantillas se resuelve - Se ejecutan consultas de base de datos → WP_Query se ejecuta, frecuentemente 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, la respuesta comienza
- El navegador analiza HTML → descubre CSS, JS, fuentes, imágenes
- Se cargan recursos que bloquean el renderizado → hojas de estilo de 15 plugins diferentes
- La página finalmente se renderiza → el usuario ve contenido
Los pasos 4 al 9 suceden en cada solicitud sin cachear. 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 admiten. 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 carga aproximadamente 100,000 líneas de código PHP en cada solicitud. Añade WooCommerce y estás por encima de 400,000 líneas.
Aquí está la cuestión: 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, rompen con contenido personalizado, y aún así 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 completo de CSS y JavaScript en cada página, sin importar 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 page-builder -->
<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 ellas es un recurso que bloquea el renderizado. Tu LCP no puede suceder hasta que todas estén descargadas y analizadas.
Plugin Bloat: El asesino silencioso del rendimiento
El sitio promedio de WordPress ejecuta 20-30 plugins. He visto sitios con 70+. Cada plugin potencialmente:
- Añade sus propios archivos CSS y JS (a menudo en cada página, incluso donde no se usan)
- Registra ganchos 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 arranque
- Añade scripts y estilos en línea al
<head>
Un ejemplo real
Recientemente audité un sitio de marketing que ejecutaba WordPress con 34 plugins activos. Así es como se veía el gráfico de 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
- Solicitudes totales: 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, el LCP era de 4.2 segundos. Aún fallaba.
¿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 una enorme carga de CSS que bloquea el renderizado.
La trampa de la dependencia de plugins
Aquí está lo que empeora esto: los plugins dependen de otros plugins. Instalas WooCommerce, luego necesitas un plugin de puerta de pago, luego un plugin de cálculo de envío, luego un plugin de filtro de productos. Cada uno añade peso. No puedes eliminar ninguno sin romper la funcionalidad.
Esta es la trampa de WordPress. La arquitectura incentiva añadir plugins para todo, y no hay un mecanismo para tree-shake código no utilizado.

Problemas de consultas de base de datos que los plugins no pueden solucionar
WordPress utiliza 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 cargadas automáticamente totalizando 8MB de datos.
-- Comprueba el tamaño de tus opciones cargadas automáticamente
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 menores a $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.
Comprobación de realidad del recuento de consultas
Instala el plugin Query Monitor en tu sitio de WordPress y mira el recuento de consultas. Una página de producto "simple" de WooCommerce 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? Generalmente 80-120 consultas.
Compáralo con un enfoque headless donde tu frontend de Next.js realiza exactamente una llamada a la API (o cero, si usas generación estática) para obtener todos los datos que necesita.
Hosting de WordPress: Probablemente estás pagando de más por mediocridad
Hablemos de 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 gestionado (WP Engine, Flywheel) | $25-300 | 400ms-1.2s | No |
| Premium gestionado (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í |
Observa esa última columna. Ninguna cantidad de actualización de hosting soluciona los problemas arquitectónicos. Estás pagando precios premium para hacer que PHP corra 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 inicial 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 da implementación edge en su CDN global. Las matemáticas no mienten.
Cómo Next.js soluciona cada Core Web Vital
Seamos específicos. Aquí está cómo Next.js (especialmente con el App Router en Next.js 14/15) aborda cada métrica:
Solucionando 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 se 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. El TTFB se reduce a 50-100ms independientemente de dónde se encuentren tus usuarios. Sin ejecución de PHP, sin consultas de base de datos, sin procesamiento del lado del servidor en tiempo de solicitud.
Para contenido dinámico, Next.js admite ISR (Incremental Static Regeneration), que sirve páginas estáticas cacheadas mientras se revalida en segundo plano:
// Revalida cada 60 segundos
export const revalidate = 60;
Solucionando LCP
Next.js incluye el componente <Image> que maneja todo lo que los plugins de WordPress intentan (y fallan) 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,
// lazy loading por defecto, previene CLS
/>
);
}
El prop priority le indica a Next.js que precargue la imagen, mejorando directamente el LCP. La negociación de formato automática sirve WebP o AVIF a navegadores compatibles, reduciendo el tamaño de imagen en 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 se carga el CSS usado en una página específica.
Solucionando INP
INP mide qué tan rápido responde tu sitio a las interacciones del usuario. Los sitios de WordPress fallan en INP porque:
- JavaScript pesado de plugins bloqueando el hilo principal
- jQuery y sus plugins compitiendo por tiempo de ejecución
- Sin division de código — todo se carga por adelantado
Next.js maneja esto con división automática de código. Cada página solo carga el JavaScript que necesita:
// Este componente solo se carga cuando el usuario se desplaza hacia él
import dynamic from 'next/dynamic';
const HeavyChart = dynamic(() => import('@/components/HeavyChart'), {
loading: () => <ChartSkeleton />,
ssr: false, // No renderizar en servidor
});
Los React Server Components (por defecto en el 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 componentes.
Solucionando CLS
CLS en WordPress generalmente viene de:
- Imágenes sin dimensiones explícitas
- Anuncios que se cargan tarde y empujan contenido hacia abajo
- Web fonts causando FOUT/FOIT
- Banners inyectados por plugins que aparecen 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 incrusta declaraciones de fuente y usa font-display: swap sin cambio de diseño:
import { Inter } from 'next/font/google';
const inter = Inter({ subsets: ['latin'] });
export default function RootLayout({ children }) {
return (
<html lang="en" className={inter.className}>
<body>{children}</body>
</html>
);
}
Sin FOUT. Sin cambio de diseño de fuentes. Simplemente funciona.
La arquitectura headless: WordPress como CMS, Next.js como frontend
Aquí está la parte que muchas personas pierden: pasar a headless no significa abandonar WordPress. Significa usar WordPress para lo que realmente es bueno — gestión de contenido — mientras dejas que Next.js maneje el frontend.
La arquitectura se ve así:
[WordPress Admin] → [REST API / WPGraphQL] → [Next.js Frontend] → [Vercel Edge CDN]
↑ ↑
Los editores de contenido Tus usuarios
usan el familiar obtienen páginas rápidas
panel de WordPress 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 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.
¿Qué pasa con otras opciones de CMS headless?
WordPress no es la única opción para la capa de contenido. Si estás comenzando de nuevo, plataformas de CMS headless construidas especialmente como Sanity, Contentful o Storyblok a menudo son mejores opciones. Se construyen API-first, así que no hay bagaje 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 de rendimiento reales: 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 |
| Puntuación Lighthouse | 45-65 | 95-100 | Día y noche |
"Optimizado" significa WordPress: PHP 8.3, caché de objetos 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 así no es cercano.
Ruta de migración: De WordPress monolítico a headless Next.js
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 de WordPress con PageSpeed Insights y datos de CrUX
- Inventaría todos los plugins y mapéalos a funcionalidad 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 del frontend (4-8 semanas)
- Configura el proyecto Next.js con el App Router
- Instala y configura WPGraphQL en WordPress
- Construye biblioteca de componentes que coincida con el diseño actual (o rediseña — es un buen momento)
- 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 el frontend de Next.js en Vercel (o Netlify, o Cloudflare Pages)
- Configura DNS y redirecciones
- Verifica que todas las URLs estén correctamente redirigidas (la preservación de SEO es crítica)
- Cierra el acceso público al admin de WordPress
Fase 4: Optimización (continuo)
- Monitorea Core Web Vitals en Google Search Console
- Ajusta los intervalos de revalidación de ISR
- Añade middleware edge para personalización
- Considera migrar a un CMS headless construido especialmente si WordPress se convierte en un cuello de botella
Si estás considerando este tipo de migración, puedes verificar nuestra página de precios para números aproximados, o comunícate directamente para discutir tu situación específica.
Para sitios construidos con Astro en lugar de Next.js (particularmente blogs y sitios de marketing con mucho contenido), también tenemos una práctica de desarrollo Astro que proporciona un rendimiento aún más agresivo para sitios estáticos-primero.
Preguntas frecuentes
¿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 llevar un sitio de WordPress al rango "necesita mejora" de Core Web Vitals de esta manera. Pero romper en el rango "bueno" consistentemente en todas las métricas — especialmente INP — es extremadamente difícil con una arquitectura tradicional de WordPress.
¿Cuánto cuesta migrar de WordPress a headless Next.js? 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 comercio electrónico con WooCommerce son más complejos, oscilando de $50,000-$150,000+. El ROI generalmente 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 bajará si cambio a Next.js? No si manejas la migración correctamente. Redirecciones 301 apropiadas, estructuras de URL idénticas (o redirecciones mapeadas), etiquetas meta válidas, datos estructurados y un sitemap XML son todos esenciales. Next.js en realidad tiene ventajas de SEO — Core Web Vitals más rápidos mejoran directamente las clasificaciones, y la Metadata API facilita gestionar etiquetas meta programáticamente. La mayoría de los sitios ven mejoras de clasificación dentro de 2-3 meses de la migración.
¿Los editores de contenido pierden el admin de WordPress si nos volvemos headless? No. En una configuración headless, WordPress continúa sirviendo como backend de gestión de contenido. Los editores usan el mismo panel, el mismo editor, el mismo flujo de trabajo. Solo no ven el tema frontend anymore — 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.
¿Qué pasa con WooCommerce — ¿puede Next.js manejar comercio electrónico? Sí, pero es un proyecto más grande. Puedes usar WooCommerce headlessly a través de su API REST o extensión WooCommerce WPGraphQL. Alternativamente, muchos equipos migran a la Shopify Storefront API o Saleor para el backend de comercio, usando Next.js como frontend. El flujo de pago requiere manejo cuidadoso ya que implica procesamiento de pagos y cumplimiento de PCI. Es posible, pero planifica para 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 envía cero JavaScript por defecto. Next.js gana para sitios que necesitan características significativas de interactividad, características dinámicas, o comercio electrónico. Trabajamos con ambos 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 un post 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 cachea en el edge. La revalidación sucede en segundo plano, así que los usuarios nunca esperan una construcción. También puedes establecer revalidación basada en tiempo (por ejemplo, reconstruir cada 60 segundos) como alternativa.
¿Cuál es el error más grande que cometen los equipos al volverse headless? Intentar replicar su sitio de WordPress 1:1 en Next.js. Una migración headless es una oportunidad para repensar tu arquitectura de contenido, simplificar tus estructuras de página, y eliminar años de acumulación. Los equipos que lo tratan como un nuevo comienzo — manteniendo el contenido pero repensando la presentación — terminan con resultados dramáticamente mejores que los equipos que intentan copiar cada widget y barra lateral de su tema antiguo.