Core Web Vitals are Google’s standardised set of user experience metrics that feed directly into page ranking signals. Getting them right matters both for SEO and for how your site actually feels to use — a slow LCP, a sluggish interaction, or a layout that jumps on load are all things users notice and abandon.
One important update before we get into fixes: First Input Delay (FID) was retired as a Core Web Vital on March 12, 2024 and replaced by Interaction to Next Paint (INP). Any guide still referencing FID as a current metric is out of date. The three active Core Web Vitals as of 2026 are LCP, INP, and CLS.
The fastest way to see where you actually stand: open PageSpeed Insights with your URL. It shows both lab data (Lighthouse) and real user data from Google’s CrUX dataset — focus on the field data, since that’s what Google’s ranking algorithm uses. Google Search Console’s Core Web Vitals report (under Experience) gives a broader view across all your pages.
The three Core Web Vitals: thresholds and what they measure
- Largest Contentful Paint (LCP) — time until the largest content element in the viewport (typically a hero image or H1 text) finishes loading. Good: ≤2.5s. Needs improvement: 2.5–4s. Poor: >4s.
- Interaction to Next Paint (INP) — the 98th percentile response time across all user interactions (clicks, taps, key presses) during a page visit. Replaced FID on March 12, 2024. Good: ≤200ms. Needs improvement: 200–500ms. Poor: >500ms.
- Cumulative Layout Shift (CLS) — total amount of unexpected layout movement during the page’s life. Good: ≤0.1. Needs improvement: 0.1–0.25. Poor: >0.25.
All three need to be in the “Good” range for a URL to pass the Core Web Vitals assessment in Google Search Console. One failing metric fails the whole URL.
Largest Contentful Paint (LCP)
LCP is the one that matters most on most WordPress sites. The LCP element is almost always the hero image on the homepage or a post’s featured image at the top of the page. Every millisecond saved on that specific resource directly improves your LCP score.
Identify your LCP element
Open Chrome DevTools → Performance tab → record a page load → look for the “LCP” marker in the timeline. Or use the Web Vitals Chrome extension, which highlights the LCP element directly on the page. Once you know exactly which element is causing your LCP, you know what to fix.
Preload the LCP image
The single highest-impact LCP fix for most WordPress sites: add a preload hint for the LCP image so the browser fetches it before it encounters the <img> tag in the HTML. Add to your theme’s functions.php:
function preload_lcp_image() {
if (is_front_page()) {
echo '<link rel="preload" as="image"
href="' . get_template_directory_uri() . '/images/hero.webp"
fetchpriority="high">';
}
}
add_action('wp_head', 'preload_lcp_image', 1);
Also ensure the LCP <img> element itself has fetchpriority="high" and does not have loading="lazy" — lazy loading the LCP image is a common mistake that significantly delays it.
Serve images in WebP and use correct sizing
WordPress generates WebP versions of uploaded images and outputs srcset automatically since version 5.8. Ensure your theme’s add_theme_support('post-thumbnails') and registered image sizes match the display sizes you actually use — serving a 2000px image in a 400px container wastes bandwidth and delays LCP.
For additional image compression before upload, Smush and ShortPixel both work well. The mobile-first design guide covers fetchpriority, lazy loading configuration, and responsive image setup in more detail.
Reduce Time to First Byte (TTFB)
LCP can’t start until the HTML arrives. A slow TTFB (>600ms) sets a ceiling on your LCP score regardless of image optimisation. Causes: slow hosting, no server-level caching, unoptimised database queries from too many plugins. Fixes in order of impact:
- Use managed WordPress hosting with server-level caching (Kinsta uses LiteSpeed, WP Engine uses EverCache) — these cache full pages at the server layer, bypassing PHP entirely on cached requests
- Add a CDN — Cloudflare’s free tier is the most practical option for most WordPress sites, reducing latency for global visitors without cost
- Deactivate unused plugins — every active plugin adds PHP execution overhead to uncached requests
The high-performance WordPress guide covers server configuration, caching layers, and database optimisation in detail. If your goal is a perfect Lighthouse score, see the WordPress 100/100 Lighthouse score guide.
Minify and defer render-blocking resources
CSS that blocks rendering delays LCP. JavaScript that blocks the main thread delays both LCP and INP. WP Rocket, LiteSpeed Cache, and Autoptimize all handle CSS/JS minification and deferral. The most important setting: defer or delay non-critical JavaScript so it doesn’t block the LCP render. For caching plugin comparisons, see WP Rocket vs W3 Total Cache vs LiteSpeed Cache.
Interaction to Next Paint (INP)
INP replaced FID on March 12, 2024. The key difference: FID only measured the delay before the browser began handling the first user interaction. INP measures the actual response time of all interactions throughout a page visit — clicks, taps, keyboard input — and reports the 98th percentile (the worst interaction, discarding only the worst 2%).
A poor INP score means your page feels sluggish to interact with. The most common causes on WordPress sites:
Long JavaScript tasks blocking the main thread
JavaScript runs on the browser’s main thread. Any task longer than 50ms can delay INP. Common offenders: heavy page builder scripts (Elementor, Divi), large third-party widgets, analytics scripts that run on interaction, and unoptimised slider or animation plugins.
Fix approaches:
- Defer non-critical JS: WP Rocket’s “Delay JavaScript Execution” feature delays third-party scripts until user interaction. LiteSpeed Cache has an equivalent setting.
- Remove unused plugins: Every active plugin that enqueues a JavaScript file adds to the main thread load. Deactivate any plugin whose functionality you’re not actively using.
- Use a lightweight theme: Themes like Astra and GeneratePress ship minimal JavaScript. Heavy multipurpose themes (large Themeforest themes, Divi’s builder layer) are a common root cause of poor INP scores.
Third-party scripts
Google Analytics 4, Meta Pixel, chat widgets, and ad scripts all run JavaScript that competes for the main thread. Strategies:
- Load analytics scripts with
type="module"or defer them until after interaction - Use a tag manager (Google Tag Manager) to load third-party tags asynchronously
- Remove any third-party script you’re not actively using — verify against your actual analytics integrations
Cumulative Layout Shift (CLS)
CLS measures how much the visible page content moves unexpectedly after initial render. A banner sliding in above the nav, an image loading without reserved space, or a font swap that reflows text all contribute to CLS.
Set explicit image dimensions
The most common CLS cause: images without width and height attributes. Without them, the browser can’t reserve space before the image loads, so surrounding content jumps when the image appears. WordPress has generated width and height attributes on images automatically since version 5.5 — but only for images inserted through the media library. Images hardcoded into theme templates or older page builder content may still be missing these attributes. Check and add them.
Web fonts
When a web font loads after text has already rendered using a fallback font, the text reflows — this is a CLS source. Two fixes:
- Add
font-display: swapto your@font-facedeclarations (shows fallback text immediately, swaps when the web font loads) - Preload critical fonts:
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>in<head>
Self-hosting fonts is more reliable than Google Fonts for CLS — you control the response time. The font-display: optional value is even more CLS-safe (no swap at all if the font isn’t ready within the render window) but shows the fallback more often on slow connections.
Reserve space for dynamically loaded content
- Ads and banners: Reserve their container with a fixed
min-heightso the surrounding content doesn’t jump when the ad loads - Cookie consent banners: These are a significant CLS source — if they push content down, fix them with a fixed-position overlay style that doesn’t affect document flow
- Embeds: YouTube videos, tweets, and other iframes need an aspect-ratio container. CSS
aspect-ratio: 16/9on the container reserves the correct space without requiring hardcoded pixel heights
Tools to measure Core Web Vitals
- Google Search Console → Core Web Vitals report: Shows field data (real user data from CrUX) across all your pages, grouped by status. This is the authoritative source — it’s what Google’s algorithm uses.
- PageSpeed Insights: Shows both lab data (Lighthouse, synthetic) and field data (CrUX, real users) for a specific URL. Run it on your homepage and on a typical blog post — they often have very different scores.
- Chrome DevTools → Performance panel: Records a page load and shows exactly where time is spent, which tasks block the main thread, and when LCP fires. Necessary for diagnosing INP root causes.
- Web Vitals Chrome extension: Shows live LCP, INP, and CLS values as you interact with a page. Highlights the LCP element in red. Fast for spot-checking.
- GTmetrix: Lab data only (not real user data). Useful for waterfall analysis of which resources are slow, but GTmetrix scores don’t map directly to Google’s field data assessments.
WordPress-specific fix priority order
Applied in this order, these cover the vast majority of Core Web Vitals issues on WordPress sites:
- Hosting tier — managed WordPress hosting with server-level caching eliminates TTFB as a bottleneck. No optimisation plugin compensates for slow shared hosting.
- Caching plugin — WP Rocket, LiteSpeed Cache (if your host runs LiteSpeed), or W3 Total Cache. Handles page caching, CSS/JS minification, and JavaScript deferral in one plugin.
- LCP image optimisation — preload hint,
fetchpriority="high", noloading="lazy", correct display size. - WebP images — compress and convert uploaded images. WordPress handles WebP generation and
srcsetoutput automatically since 5.8. - JavaScript deferral — defer or delay non-critical JS (page builder scripts, third-party widgets, analytics) to improve INP.
- Unused plugin removal — every inactive but installed plugin adds autoloaded option data; every active plugin adds PHP execution. Deactivate and delete anything you’re not using.
- Lightweight theme — if your theme is the INP bottleneck, switching to Astra or GeneratePress is faster than optimising around a heavy builder.
- Image dimensions and font handling — add explicit
width/heightto all images; usefont-display: swapand preload critical fonts.
Hosting, theme, and plugin decisions made before you build the site are the biggest long-term Core Web Vitals factors — see the pre-build WordPress decisions checklist for what to get right early. For the full ranking-signal picture around performance and SEO setup, see the WordPress SEO plugins guide.


