Skip to content

WordPress Core Web Vitals: how to pass them, step by step

Published 7 October 20269 min readBy the SmoothSeen editorial team

Passing Core Web Vitals on WordPress means your pages load, respond and settle quickly for real visitors: LCP of 2.5 s or less, INP of 200 ms or less and CLS of 0.1 or less, at the 75th percentile. You get there by measuring first, adding page caching, keeping lazy loading off the main image and trimming plugin JavaScript.

Key points

  • Google assesses Core Web Vitals with real-user data at the 75th percentile; the good thresholds are LCP ≤ 2.5 s, INP ≤ 200 ms and CLS ≤ 0.1.
  • WordPress core already ships native lazy loading (5.5), fetchpriority="high" on the main image (6.3), AVIF uploads (6.5) and speculative loading (6.8).
  • The WordPress documentation calls page caching "the biggest benefit for the smallest hassle", and Site Health has checked for it since 6.1.
  • Performance Lab is the official plugin from the WordPress Performance Team for testing improvements before they reach core.
  • Combining CSS and JavaScript into a single file is advice the official documentation limits to HTTP/1.x.

To check it on your own site: SEO audit

On this page

Web performance optimisation is the set of changes that reduce how long a page takes to render, to respond and to stop moving. On WordPress, part of that work is done by core and part depends on your own choices: the host, the theme, the page builder and every plugin you activate. This guide separates what is already done for you from what you need to do, with exact versions and official sources. The current version of WordPress is 7.1 (7.1.3, released on 6 October 2026)1.

Measure before you change anything

Core Web Vitals are three user-experience metrics: LCP (how long the main element takes to render), INP (how long the page takes to respond to a click or tap; it replaced FID in March 2024) and CLS (how much the content shifts while loading).

There are two kinds of data, and they should not be mixed up:

  • Field data. PageSpeed Insights shows the experience of real Chrome users over the previous 28 days2. This is what Google uses. If the URL does not have enough traffic, it falls back to data for the whole origin, and if there is not enough of that either, it shows nothing2.
  • Lab data. Lighthouse simulates a page load under fixed conditions. It is useful for debugging and for before-and-after comparisons, but it is not the score Google sees.

The Core Web Vitals report in Search Console uses the same field data, groups URLs that offer a similar experience and splits mobile from desktop3. On WordPress this is handy: if a group of blog posts fails, the cause is usually the single post template, not each article.

Measure three templates rather than one page: the home page, a blog post and a service or product page. Note the field values for each before you touch anything.

What does WordPress already do for speed?

Before installing anything, find out what core already handles. This table summarises what the WordPress team has published on make.wordpress.org/core:

Version
5.5 (2020)
What it added
Native loading="lazy" on content images, only when they have width and height4
What it means for you
Images further down the page do not hold up the first load
Version
5.8 (2021)
What it added
WebP uploads5
What it means for you
A lighter format without plugins, if your server supports it
Version
6.1 (2022)
What it added
Page cache and persistent object cache checks in Site Health6
What it means for you
WordPress warns you when there is no page cache or the server is slow
Version
6.3 (2023)
What it added
fetchpriority="high" on the image it estimates to be the LCP, and no lazy loading on the first images7
What it means for you
The main image is requested sooner
Version
6.3 (2023)
What it added
defer and async loading strategies when registering scripts8
What it means for you
Themes and plugins can load JavaScript without blocking rendering
Version
6.5 (2024)
What it added
AVIF uploads9
What it means for you
Another lightweight format, with the same server conditions
Version
6.8 (2025)
What it added
Speculative loading: prefetches the next page as the visitor starts clicking a link10
What it means for you
Moving between pages gets faster

Three details that change decisions:

  1. Automatic lazy loading needs dimensions. WordPress only adds loading="lazy" to images with width and height4, and since 6.3 it skips the first three images by default7. Markup printed by a page builder, or an image set as a CSS background, may fall outside that logic.
  2. Neither WebP nor AVIF converts your existing images. Version 6.5 lets you upload AVIF but does not transform what you already have; generating them on upload needs a filter or a plugin9.
  3. Speculative loading has limits. It is on for logged-out visitors on sites with pretty permalinks, uses prefetch with conservative eagerness and excludes URLs with query parameters10.

Performance Lab: the Performance Team's plugin

Performance Lab is the official plugin from the WordPress Performance Team. It bundles features under test, most of which are meant to end up in core11. Its current version requires WordPress 6.9 or later11.

From it you can switch on individual modules, each shipped as its own plugin. The ones listed on its official page include Image Prioritizer, Modern Image Formats, Enhanced Responsive Images, Embed Optimizer, Optimization Detective, Speculative Loading and View Transitions (experimental)11. Two rules for using it well:

  • Turn them on one at a time and measure between changes. These are features under test: if something breaks, you will know which one did it.
  • Do not duplicate features. If your caching or image plugin already converts to WebP or defers scripts, leave the equivalent module off.

Page caching: plugin or server

A page cache stores the generated HTML for each URL and serves it without running PHP or querying the database. The WordPress documentation describes caching as "the biggest benefit for the smallest hassle" and explains that caching plugins store posts and pages as static files12.

There are three places to put it, and one is enough:

  1. At your host. Many managed WordPress hosts run a server-side page cache already. Ask before installing a plugin.
  2. In the web server or a proxy. The WordPress documentation mentions Varnish as an example of server-side caching12. If you manage the server yourself, the guides to compression and caching in Apache and gzip, Brotli and caching in Nginx cover that layer.
  3. With a caching plugin. There are several free ones in the WordPress directory. None is "the best" in the abstract: pick one your host recommends, or at least does not advise against.

To find out whether you already have a page cache, open Tools > Site Health. Since 6.1, WordPress detects page caching from the response headers and treats a server response under 600 ms as acceptable6.

Fix the metric that fails

Start with whichever metric is red in the field data, on the template where it fails. This table sums up the causes that come up most often on WordPress and the fix according to web.dev:

Problem
Slow LCP
Typical cause on WordPress
Main image given loading="lazy" by the theme or an optimisation plugin
Fix
Remove lazy loading from that image: web.dev says never to lazy-load the LCP image13
Problem
Slow LCP
Typical cause on WordPress
Main image set as a CSS background on a page builder section
Fix
Use an img element in the HTML, which the browser discovers sooner13
Problem
Slow LCP
Typical cause on WordPress
Slow server with no page cache
Fix
Enable page caching and check Site Health6
Problem
High INP
Typical cause on WordPress
Lots of third-party scripts: chat, maps, analytics, pixels
Fix
Remove the ones that add nothing and load the rest with async or defer14
Problem
High INP
Typical cause on WordPress
Page builder producing a very large DOM
Fix
Simplify the template: rendering work grows with DOM size15
Problem
High CLS
Typical cause on WordPress
Images or iframes without width and height
Fix
Always set dimensions, or reserve the space with aspect-ratio16
Problem
High CLS
Typical cause on WordPress
Cookie banners, ads or notices that push content down
Fix
Reserve their space with min-height16
Problem
High CLS
Typical cause on WordPress
Web fonts that swap in late
Fix
font-display: optional, fallback fonts tuned with size-adjust, or preloading the critical font16

LCP: the main image

On most WordPress pages the LCP element is an image: the post's featured image or the home page hero. web.dev asks for three things: no lazy loading, an image present in the initial HTML so the browser finds it early, and fetchpriority="high"13. WordPress handles the last two through its image functions7, but a theme or an "optimisation" plugin can undo that. View the page source and look at the tag for that image.

INP: plugin and third-party JavaScript

INP gets worse when the main thread is busy with long tasks, and during page load every script being evaluated adds delay to the first interaction15. On WordPress, that JavaScript mostly comes from plugins that load their files on every page even when only one page uses them, and from third-party services. web.dev suggests an order: remove whatever does not add clear value, then defer the rest14.

CLS: dimensions, fonts and notices

CLS on WordPress nearly always has a specific culprit: an image without dimensions in a custom block, a consent banner that appears at the top and pushes the page down, or a web font that changes the size of the text as it loads. All three are fixed by reserving the space before the content arrives16.

What not to touch

Some advice that still circulates for WordPress does not hold up today, or only applies in certain cases:

  • Combining all CSS and JavaScript into one file. The WordPress documentation recommends this only "when still using HTTP/1.x"12. With HTTP/2 or HTTP/3 it does not ask for it; only turn it on if a before-and-after measurement backs you up.
  • Lazy-loading every image. The main image should never be lazy-loaded13. Check that your optimisation plugin leaves it out.
  • Two caching plugins at once. They duplicate work and make it hard to tell which version of a page is being served. Use one, and confirm it in Site Health.
  • Chasing a Lighthouse score of 100. It is a lab test. Google assesses field data at the 75th percentile3.

How to check it

  1. Run the home page, a blog post and a service page through PageSpeed Insights and note the field data.
  2. Review the Core Web Vitals report in Search Console, for mobile and desktop separately.
  3. Open Tools > Site Health and look for the page cache and response time notices.
  4. After each change, compare the lab results straight away. Field data takes longer: PageSpeed Insights summarises the previous 28 days2, so an improvement needs weeks to show in full.

What SmoothSeen does with this

SmoothSeen measures the speed of the page you give it using the real-user Core Web Vitals published by PageSpeed Insights and Google's thresholds; if the page lacks enough field data, it uses the Lighthouse lab test instead. Speed sits in the search visibility score alongside text compression, HTTPS and the other checks, and turns into tasks in a prioritised action plan.

What to do this week

Measure your three main templates in PageSpeed Insights and note which metric fails on each. Fix the main image on the template that fails LCP first, and confirm in Site Health that you have a page cache. If you want those measurements side by side with your competitors', analyse your site with SmoothSeen.

Frequently asked questions

Which caching plugin is best for WordPress?

There is no single best one. First find out whether your host already runs a server-side page cache, because then a plugin is redundant. If it does not, any caching plugin from the official directory that works well with your theme will do. Judge the outcome in Site Health and in the PageSpeed Insights field data, not by the plugin's reputation.

Why does PageSpeed Insights give me a different score every time?

The performance score at the top comes from the Lighthouse lab test, which varies with network conditions and server load at that moment. Field data, on the other hand, summarises 28 days of real visits and barely moves from one day to the next. To decide whether your WordPress site passes, look at the field data and its three metrics.

Do Elementor and other page builders slow a site down?

A page builder does not doom a site, but it adds HTML, CSS and JavaScript that a hand-built template would not need. The risk shows up in INP, because a very large DOM makes every screen update more expensive, and in LCP when the main image is set as a CSS background. Measure the template with field data before deciding whether to replace it.

Do I need to convert all my images to WebP or AVIF?

It is not mandatory. WordPress has accepted WebP uploads since 5.8 and AVIF since 6.5, but it does not convert the images you already have. Start with the images that are the LCP element on your main templates, because that is where a lighter file improves the metric that counts. The rest can wait for a plugin that generates them on upload.

Sources

  1. 1Releases, WordPress.org, accessed 7 October 2026.
  2. 2About PageSpeed Insights, Google for Developers, updated 21 October 2024.
  3. 3Core Web Vitals report, Search Console Help, accessed 7 October 2026.
  4. 4Lazy-loading images in 5.5, Make WordPress Core, 14 July 2020.
  5. 5WordPress 5.8 adds WebP support, Make WordPress Core, 7 June 2021.
  6. 6New cache Site Health checks in WordPress 6.1, Make WordPress Core, 6 October 2022.
  7. 7Image performance enhancements in WordPress 6.3, Make WordPress Core, 13 July 2023.
  8. 8Registering scripts with async and defer attributes in WordPress 6.3, Make WordPress Core, 14 July 2023.
  9. 9WordPress 6.5 adds AVIF support, Make WordPress Core, 23 February 2024.
  10. 10Speculative Loading in 6.8, Make WordPress Core, 6 March 2025.
  11. 11Performance Lab, WordPress.org Plugin Directory, updated 26 August 2026.
  12. 12Optimization, WordPress Developer Resources, updated 17 December 2025.
  13. 13Optimize Largest Contentful Paint, web.dev (Google), updated 31 March 2025.
  14. 14Efficiently load third-party JavaScript, web.dev (Google), updated 19 February 2024.
  15. 15Optimize Interaction to Next Paint, web.dev (Google), updated 2 September 2025.
  16. 16Optimize Cumulative Layout Shift, web.dev (Google), updated 7 February 2025.

How to cite this article

SmoothSeen. (2026, October 7). WordPress Core Web Vitals: how to pass them, step by step. https://smoothseen.com/en/blog/wordpress-core-web-vitals/

Who writes this

SmoothSeen is a website audit tool that measures visibility in search engines and AI assistants and delivers reports under the agency's own brand.

This blog belongs to SmoothSeen: when an article discusses the product, it does so knowing the product is ours. Third-party figures link to their original source.

Change history

  • First version.

Keep reading

WordPress Core Web Vitals: a step-by-step guide