A slow WordPress site costs you in ways that rarely show up on a single report. Visitors leave before the hero image appears, mobile shoppers abandon carts when buttons lag, and Google's ranking systems quietly favor competitors whose pages feel faster. The good news: most slow WordPress sites are slow because of fixable decisions such as cheap hosting, oversized images, heavy plugins and third-party scripts, not WordPress itself.
This checklist covers what actually moves Core Web Vitals on WordPress in 2026, in the order we tackle it on client sites: measure first, fix the foundations, then work through images, fonts, scripts and the database. Each section explains the why in plain English, so you can prioritize even if you're not the one making the changes.
Key takeaways
- Core Web Vitals measure loading (LCP), responsiveness (INP) and visual stability (CLS); "good" means LCP ≤ 2.5 s, INP ≤ 200 ms and CLS ≤ 0.1 for at least 75% of real visits.
- Field data from real users (CrUX, Search Console) is what Google uses; lab tools like Lighthouse are for diagnosing problems.
- Hosting, a current PHP version and page caching fix the largest share of problems on most sites.
- The LCP image should be properly sized, in a modern format, never lazy-loaded and marked with
fetchpriority="high". - Plugin bloat and third-party scripts are the most common causes of poor INP; audit them ruthlessly.
- Speed isn't a one-off project. Updates, new plugins and new content erode it unless someone monitors it.
Why speed matters
Speed affects three things business owners care about:
- User experience. People judge a site within a second or two. If the main content hasn't appeared, or the page jumps around as it loads, trust drops before they've read a word.
- Conversions. Industry studies have consistently found that faster pages convert better, and the effect is strongest on mobile, where networks and devices are slower. In our experience, fixing serious speed problems typically lowers bounce rates, especially on landing pages and checkouts.
- SEO. Core Web Vitals are part of Google's page experience signals. They won't outrank better content on their own, but when competing pages are similarly relevant, a better experience can tip the balance. A slow site also gets crawled less efficiently.
Core Web Vitals explained
Google's Core Web Vitals are three metrics that capture how a page feels to a real visitor:
Largest Contentful Paint (LCP)
LCP measures how long it takes for the largest visible element (usually a hero image, a featured image or a big heading) to appear. It is the best single proxy for "when does this page look loaded?" Slow servers, render-blocking CSS and JavaScript, and heavy images are the usual culprits.
Interaction to Next Paint (INP)
INP measures responsiveness: how quickly the page visibly reacts when someone clicks, taps or types, across the whole visit. It replaced First Input Delay (FID) as a Core Web Vital in March 2024. FID only measured the delay before the first interaction started processing; INP looks at all interactions and the full time until the next frame is painted. That makes it much stricter, and many WordPress sites that passed FID easily now struggle with INP because of heavy JavaScript.
Cumulative Layout Shift (CLS)
CLS measures how much visible content moves unexpectedly while the page loads, such as a button that jumps down just as you tap it because an ad or image loaded above it. Images without dimensions, late-loading web fonts, injected banners and embeds are the common causes.
| Metric | What it measures | Good | Needs improvement | Poor |
|---|---|---|---|---|
| LCP | Loading of main content | ≤ 2.5 s | 2.5–4.0 s | > 4.0 s |
| INP | Responsiveness to interactions | ≤ 200 ms | 200–500 ms | > 500 ms |
| CLS | Visual stability | ≤ 0.1 | 0.1–0.25 | > 0.25 |
To pass, a page needs to hit the "good" threshold at the 75th percentile of real visits, measured separately for mobile and desktop. Mobile is almost always the harder target.
How to measure speed properly
There are two kinds of data, and mixing them up causes a lot of wasted effort:
- Field data comes from real Chrome users visiting your site, collected in the Chrome User Experience Report (CrUX) over a rolling 28-day window. This is what Google uses for ranking.
- Lab data comes from a simulated test of one page load on a set device and network. It's ideal for diagnosing problems and checking fixes, but a Lighthouse score is not your Core Web Vitals result.
The tools we use on every audit:
- PageSpeed Insights shows CrUX field data at the top (if your site has enough traffic) and a Lighthouse lab test below, with specific diagnostics such as which element is your LCP.
- Google Search Console, under the Core Web Vitals report, groups your URLs by status and template, so you can see whether a problem affects all blog posts or only product pages.
- Lighthouse in Chrome DevTools, plus the Performance panel, lets you trace exactly which scripts block the main thread and hurt INP.
- CrUX history (via the CrUX dashboard or API) shows trends over months, which is useful for proving that changes worked.
Hosting and PHP version
No amount of front-end tuning will rescue a slow server. Time to First Byte (TTFB), meaning how long the server takes to start sending the page, comes before everything else in LCP. On a well-configured host with page caching, TTFB for cached pages should typically be well under 600 ms worldwide, and often far lower.
What to look for in hosting:
- Server resources that aren't heavily oversold. Cheap shared hosting is the most common root cause of slow WordPress sites we audit.
- A current PHP version. Each PHP 8.x release has brought performance and security improvements, so run the newest version your theme and plugins support. The official WordPress requirements page lists the currently recommended version.
- OPcache enabled, HTTP/2 or HTTP/3, and modern TLS.
- Server-level page caching and support for a persistent object cache (Redis or Memcached).
- Data centers close to your audience, or a CDN in front of the site.
Before upgrading PHP, test on a staging copy. Older plugins can throw errors on newer PHP versions, which is a good signal that they need replacing anyway.
Caching layers
WordPress builds every page dynamically with PHP and database queries. Caching avoids repeating that work. There are four layers, and a fast site uses all of them:
- Page cache: stores the finished HTML of each page and serves it directly to anonymous visitors. This is the single biggest win for most sites. Use your host's server-level cache or one well-configured caching plugin, never two caching plugins at once.
- Object cache: a persistent object cache (Redis or Memcached) stores the results of database queries in memory. It matters most for pages that can't be page-cached: logged-in users, WooCommerce carts and checkouts, membership areas and the admin.
- Browser cache: long cache lifetimes on static files (CSS, JS, images, fonts) mean returning visitors don't download them again. Use versioned file names or query strings so updates still reach users.
- CDN: a content delivery network serves static files, and ideally cached HTML, from locations close to each visitor, cutting latency for international audiences.
For WooCommerce, make sure cart, checkout and account pages are excluded from page caching, and that cart fragments don't force an uncached AJAX request on every page view.
Image optimization
Images are usually the heaviest part of a page and very often the LCP element. Work through these in order:
Format and compression
Serve WebP or AVIF instead of JPEG and PNG. Both are widely supported by modern browsers and typically produce noticeably smaller files at similar visual quality. WordPress core supports uploading both formats, and many optimization plugins and CDNs convert images automatically.
Correct sizes
Never serve a 4000-pixel photo into a 600-pixel column. WordPress generates multiple image sizes and outputs srcset and sizes attributes so the browser can pick the right one, but only if your theme uses core image functions and registers sensible sizes. Always include width and height attributes so the browser reserves space and avoids layout shift.
Lazy loading, but not for the LCP image
WordPress adds loading="lazy" to images by default, which is great for images further down the page. It is harmful for the hero or featured image, which should load as early as possible. Recent WordPress versions try to skip lazy loading for the first images and add fetchpriority="high" to the likely LCP image automatically, but custom themes, page builders and sliders often defeat this logic. Check the output and set it explicitly when needed:
<img src="/wp-content/uploads/hero-1200.avif"
srcset="/wp-content/uploads/hero-800.avif 800w,
/wp-content/uploads/hero-1200.avif 1200w"
sizes="(max-width: 800px) 100vw, 1200px"
width="1200" height="600"
fetchpriority="high"
alt="Team reviewing a website performance report">
Avoid hero sliders: they load several large images and a JavaScript library to show one picture.
Fonts
Web fonts can delay text rendering and cause layout shifts when they swap in. Best practice:
- Self-host your fonts rather than loading them from a third-party service. This removes extra connections and also simplifies privacy compliance.
- Use WOFF2 and load only the weights and character sets you actually use. Two weights of one family is a sensible target; variable fonts can cover several weights in one file.
- Set
font-displaytoswaporoptionalso text is visible immediately (see the MDN reference for font-display). - Preload the one or two font files used above the fold.
<link rel="preload" href="/wp-content/themes/your-theme/fonts/inter-var.woff2"
as="font" type="font/woff2" crossorigin>
JavaScript, CSS and plugin bloat
JavaScript is the main enemy of INP. Every script the browser must download, parse and run competes with the visitor's clicks and taps.
Defer and delay
Load non-critical scripts with defer so they don't block rendering. Since WordPress 6.3, themes and plugins can register scripts with a loading strategy:
wp_enqueue_script(
'theme-main',
get_theme_file_uri( 'assets/js/main.js' ),
array(),
'1.4.0',
array( 'strategy' => 'defer', 'in_footer' => true )
);
For scripts that aren't needed until the visitor interacts, such as chat widgets or video embeds, load them on interaction or after the page is idle.
Unused CSS
Many themes and page builders load one large stylesheet on every page. Remove unused CSS where possible, inline a small amount of critical CSS for above-the-fold content, and make sure plugins only load their assets on the pages where they're used. A contact form plugin has no reason to load scripts on every blog post.
Plugin bloat
The number of plugins matters less than what they do on each page load. Audit them all: remove anything inactive or redundant, replace heavy all-in-one plugins with lighter alternatives, and question any plugin that adds front-end scripts to every page. Sometimes a small custom plugin is faster and safer than a large general-purpose one; our custom WordPress plugin development guide explains when that trade-off makes sense.
Database cleanup
Over the years the WordPress database collects post revisions, expired transients, spam comments, orphaned metadata and options left behind by deleted plugins. The most important item is autoloaded options: data loaded into memory on every single request. Bloated autoload data slows down every uncached page, including the admin and checkout. Recent WordPress versions flag this in Site Health.
- Limit revisions (for example with
WP_POST_REVISIONSinwp-config.php) and clean up old ones. - Delete expired transients and spam or trashed comments.
- Review the largest autoloaded options and remove leftovers from uninstalled plugins.
- For WooCommerce stores, make sure High-Performance Order Storage is enabled where your extensions support it.
Always take a full backup before any database cleanup.
Third-party scripts
Analytics, tag managers, chat widgets, heatmaps, A/B testing tools, social embeds and ad pixels often account for a large share of JavaScript on marketing sites, and you can't optimize their code. For each one, ask: Who uses this data? Would anyone notice if it disappeared? Then:
- Remove scripts nobody uses. Old pixels from past campaigns are common.
- Load the rest with
deferorasync, or delay them until interaction. - Replace embedded YouTube or map iframes with a lightweight placeholder that loads the real embed on click.
- Keep tag manager containers lean and review them every quarter.
Theme choice
Your theme sets the performance ceiling. Heavy multipurpose themes and page builders bundle features for every possible use case and load much of that code on every page. A lightweight block theme or a custom theme built around Gutenberg blocks loads only what each page needs, and usually produces cleaner, smaller HTML. If your current theme is the bottleneck, a rebuild can be more cost-effective than endless patching; we compare the options in custom theme vs stock theme, and it's the foundation of our WordPress theme and website development work.
Step-by-step speed checklist
| Step | Action | Main metric helped |
|---|---|---|
| 1 | Record baseline field data (PageSpeed Insights, Search Console) for key templates | All |
| 2 | Move to quality hosting; upgrade to a current PHP 8.x version on staging first | LCP |
| 3 | Enable page caching and a persistent object cache; add a CDN | LCP |
| 4 | Convert images to WebP/AVIF, fix sizes, add width and height | LCP, CLS |
| 5 | Remove lazy loading from the LCP image and add fetchpriority="high" | LCP |
| 6 | Self-host fonts in WOFF2, set font-display, preload key files | LCP, CLS |
| 7 | Defer non-critical JavaScript; remove unused CSS | INP, LCP |
| 8 | Audit plugins; remove or replace heavy ones | INP |
| 9 | Audit and delay third-party scripts and embeds | INP |
| 10 | Reserve space for ads, banners and embeds | CLS |
| 11 | Clean the database and reduce autoloaded options | LCP (TTFB) |
| 12 | Re-test, then monitor field data monthly | All |
Keeping your site fast
Speed decays. A marketing team adds a new tracking script, an editor uploads uncompressed photos, a plugin update adds a new front-end library. Field data also lags by up to 28 days, so regressions can go unnoticed for weeks. Build a simple routine:
- Check the Search Console Core Web Vitals report monthly.
- Run PageSpeed Insights on key templates after every significant update or new plugin.
- Agree on a "performance budget" for new pages, such as a maximum page weight or script count.
- Keep WordPress core, themes, plugins and PHP up to date. Many releases include performance improvements as well as security fixes.
If you'd rather not handle this in-house, our WordPress maintenance, security and speed care plans include updates, backups and speed monitoring. For stores, see our WooCommerce development services, since checkout performance has its own set of challenges.
Frequently asked questions
What is a good PageSpeed Insights score for WordPress?
The Lighthouse score is a lab diagnostic, not a ranking factor in itself. Aim for 90 or higher where practical, but focus on passing the Core Web Vitals field data at the top of the report: LCP of 2.5 seconds or less, INP of 200 milliseconds or less and CLS of 0.1 or less.
Why does my site score well in Lighthouse but fail Core Web Vitals?
Lighthouse runs one simulated page load and cannot measure real interactions, while Core Web Vitals use 28 days of data from real visitors on their own devices and networks. Slow mobile devices, logged-in pages, third-party scripts that load later and heavy interactions often show up only in field data.
What replaced First Input Delay?
Interaction to Next Paint (INP) replaced First Input Delay as a Core Web Vital in March 2024. INP measures the responsiveness of all interactions during a visit, not just the first one, so it is a stricter test of how much JavaScript a page runs.
Do I need a caching plugin if my host has caching?
Usually not for page caching. If your host provides server-level page caching, adding a second page-caching plugin can cause conflicts. You may still use an optimization plugin for tasks like deferring scripts or image conversion, as long as its caching features are turned off.
How many plugins are too many?
There is no fixed number. One poorly built plugin that loads scripts on every page can do more damage than twenty lightweight ones. Judge plugins by what they load on the front end and how many database queries they add, and remove anything inactive or redundant.
How long does WordPress speed optimization take?
Quick wins such as caching, image optimization and script deferral can often be done in a few days. Deeper work, such as replacing a heavy theme or page builder, typically takes several weeks. Field data then needs up to 28 days to fully reflect the improvements.
Want an expert to find out what's slowing your site down? Send us your URL and goals through the project planner for a free quote, or see our Care Plan pricing for ongoing speed monitoring and maintenance.



