Skip to content
What To Fix First

Core Web Vitals assessment failed on WordPress

A failed Core Web Vitals assessment on WordPress almost always traces to four settings: a page cache that is off or bypassed, a hero image lazy-loaded or served at camera size, plugin CSS and JavaScript loading on every page, and web fonts pulled from Google. Find which metric failed in Search Console, then work the matching list below.

By , who built this checker and writes the guides. Published How the tool ranks fixes

Start from the metric Search Console names

The general guide explains what “failed” means — the slowest quarter of real visits over 28 days, judged per URL group. This page assumes you have read that far and know which metric failed, and gives the WordPress-specific causes and settings for each. Take an example URL from the failing group and run it through the WordPress speed test: the headline fix will land in one of the four lists below.

If LCP failed

On WordPress, a slow largest paint has three usual causes, in this order.

1. The page cache is off, or on but bypassed

Without a page cache every visit boots PHP and queries MySQL, and the first byte alone can be a second. Check it is really serving cached pages, not just installed:

curl -sI https://example.com/ | grep -i -E "x-cache|cf-cache-status|x-litespeed-cache|x-kinsta-cache|x-wpe"
# HIT or "hit" means cached; MISS/BYPASS/DYNAMIC on repeat requests means it is not working

Common reasons a cache is bypassed: a plugin sets a cookie on every visit (WooCommerce session, a currency switcher, some consent plugins); a security plugin sends Cache-Control: no-store; a query string in your links (UTM parameters without “ignore query strings” enabled). WP Rocket: Cache → ensure mobile caching is on. LiteSpeed Cache: Cache → Cache Settings → Cache Mobile, and Excludes for the cookies. Host-level caches (Kinsta, WP Engine, SiteGround, Cloudways) have their own exclusion rules in the host dashboard.

2. The hero image is lazy-loaded or full-size

WordPress adds loading="lazy" to images automatically, and since 6.3 tries to skip the first one and add fetchpriority="high" to the likely LCP image — but themes and builders frequently output the hero outside that logic, and optimisation plugins extend lazy-loading to everything. The fix is an exclusion:

  • WP Rocket: Media → LazyLoad → “Excluded images or iframes”; newer versions detect above-the-fold images automatically per page.
  • Perfmatters: Lazy Loading → “Exclude leading images” set to 1 or 2, and add the hero’s class to the exclusions.
  • LiteSpeed Cache: Page Optimization → Media Settings → “Lazy Load Image Excludes”, plus the LCP image list.
  • Autoptimize: Images → lazy-load exclusions by class or filename.
  • Elementor: the Image Optimization settings and, for the hero widget, the “lazy load” toggle per image.

Then the size. A 4000-pixel photo straight off a phone in a 1200-pixel slot is a 2 MB download for a 200 KB job. Regenerate thumbnails after changing image sizes (the Regenerate Thumbnails plugin), check the theme actually outputs a sized variant with srcset, and convert to WebP — WordPress 6.5+ can generate WebP on upload; for the existing library see the image formats guide.

3. Render-blocking plugin CSS and JavaScript

Every plugin’s stylesheet in the head delays the first paint; on a typical site that is a dozen files. The settings that fix it are in your optimisation plugin and are covered step by step in the render-blocking plugins guide; the plugins loading where nothing uses them are the subject of the dequeue guide.

If INP failed

INP replaced First Input Delay in March 2024 and is stricter: every tap, measured to the next frame. On WordPress the main-thread work that delays it comes from a predictable set.

  • Third-party tags. Google Tag Manager containers with a dozen tags, chat widgets, heatmap recorders. WP Rocket’s “Delay JavaScript execution”, Perfmatters’ “Delay JavaScript” and LiteSpeed’s “Load JS Deferred: Delayed” all hold these until the first interaction. Delaying is a large INP win on its own.
  • jQuery and jQuery Migrate loaded in the head and executed before anything is interactive. Defer everything except jQuery itself if inline scripts depend on it; disable jQuery Migrate if nothing needs it (Perfmatters has a toggle).
  • Builder runtimes. Elementor’s frontend script, Divi’s, and their animation libraries. Elementor: Settings → Features → enable “Improved Asset Loading” and “Optimized DOM Output”; turn off the icon libraries and Font Awesome unless used.
  • Sliders and carousels that initialise on load with hundreds of layout calculations. Replace the homepage slider with a static hero; it is the single biggest INP and LCP improvement on many sites.

The INP guide covers how to find the long tasks in DevTools if the plugin settings are not enough.

If CLS failed

Layout shift on WordPress has its own list — images the theme outputs without dimensions, Google Fonts swapping in, cookie bars injected above content, ad plugins, lazy-loaded logos — and its own page: how to fix CLS in WordPress, with the setting for each cause. The general mechanics are in the CLS guide.

The order that works on WordPress

  1. Confirm the page cache serves cached pages to mobile visitors.
  2. Fix the LCP image: excluded from lazy-load, sized to the slot, WebP.
  3. Delay third-party JavaScript until interaction; defer the rest.
  4. Dequeue plugin assets from pages that do not use them.
  5. Self-host fonts with font-display: swapthe Google Fonts guide.
  6. Set explicit dimensions on every image and reserve space for embeds and bars.
  7. Only then, and only if the first byte is still over 600 ms, consider the host.

Every setting above exists in the free tools named alongside it, and the dequeue and defer work can be done in a few lines of a must-use plugin. If the site has fifty plugins and no developer, a script manager that shows every asset per page with on/off, defer and delay switches is the practical route. For that we use Perfmatters. That is an affiliate link: we earn a commission if you sign up, at no extra cost to you.

Check it worked

Re-run the WordPress speed test on the same example URL. The headline should change to something smaller, and the LCP timeline should show the phase you worked on shrinking. Then leave Search Console alone for a month: the verdict is a 28-day window, and it lags on purpose.

Common questions

Which caching plugin fixes a failed assessment?
None of them fix it on their own, and any of the good ones — WP Rocket, LiteSpeed Cache on a LiteSpeed server, FlyingPress, or the host's own page cache — fix the part that caching can fix, which is the first byte. If your failing metric is LCP and the first byte is already under 600 ms, a caching plugin changes little; the image and the render-blocking files are the work.
My lab score is 90+ but Search Console still says failed.
The assessment is field data: the slowest quarter of real visits over 28 days. A lab run on a simulated phone can look fine while real visitors on older Android phones over mobile networks fail INP or LCP. Fix what the lab finds, then wait for the 28-day window to roll over, and expect the verdict to move slowly rather than flip.
Is it the theme or the plugins?
Usually the plugins, occasionally the builder. Run the plugin speed test on two or three pages: it ranks every plugin by the CSS and JavaScript it loads and flags the ones loading where nothing uses them. Page builders (Elementor, Divi, WPBakery) add a fixed cost to every page that only their own optimisation settings can reduce.
Should I switch hosts?
Only if your measured server response stays over 600 ms after page caching is confirmed to be serving cached pages. That is the one condition under which this checker suggests a host, and it is rarer than the marketing suggests: most 'slow WordPress hosting' is a cache that is off or bypassed.
Which metric should I fix first?
The one Search Console names in the failing group. Open the Core Web Vitals report, mobile, click the issue — 'LCP issue', 'INP issue', 'CLS issue' — and take an example URL from the table. Paste that URL into the WordPress speed test; the headline fix is the one to make first.

Check a page against this

Runs the same Core Web Vitals test as the WordPress speed test.

Free, no signup, no ads. We keep nothing except the shareable result, for 30 days.

Enter any public URL. You’ll get the one change that recovers the most load time, what it’s worth, and the measurements underneath.

Related guides

All guides