Originally published: April 21, 2025 · Last reviewed and updated: October 2026
Most slow WordPress sites are not slow because of one big problem. They are slow because of a stack of small ones: an uncached server, an oversized hero image, a page builder loading scripts on every page, and a few plugins nobody remembers installing.
This guide gives you a measured, step-by-step order for fixing those problems, starting with the changes that usually make the biggest difference for the least effort.
The Short Answer
Measure first with PageSpeed Insights, paying most attention to the real-user (field) data, then work in this order: enable page caching, fix the largest image above the fold, update PHP to a supported version, remove or limit heavy plugins and scripts, and put static files on a CDN.
Your targets are Google’s Core Web Vitals: Largest Contentful Paint (LCP) at or under 2.5 seconds, Interaction to Next Paint (INP) at or under 200 milliseconds, and Cumulative Layout Shift (CLS) at or under 0.1, measured at the 75th percentile of visits. Re-test after each change so you know which fix actually helped.
Start by Measuring the Right Thing
PageSpeed Insights shows two kinds of data. Field data comes from the Chrome UX Report and reflects real visitors over the previous 28 days. Lab data comes from a single simulated Lighthouse test. Field data is what Google’s Core Web Vitals report is based on, so treat the lab score as a diagnostic tool, not the goal.
Note that INP replaced First Input Delay as a Core Web Vital on March 12, 2024. Older guides that still talk about FID are out of date.
Test your home page, one typical post, and any page that earns money (a product or landing page). These templates usually behave differently.
Diagnose Before You Fix
Use the failing metric to decide where to start:
| If PageSpeed Insights shows… | The likely cause is… | Start with… |
|---|---|---|
| Slow server response (TTFB) | No page cache, slow hosting, or heavy database queries | Page caching, then hosting and PHP version |
| Poor LCP | Large or late-loading hero image, render-blocking CSS | Compress and resize the hero image; avoid lazy-loading it |
| Poor INP | Too much JavaScript running on the page | Remove unused plugins, delay non-essential scripts |
| Poor CLS | Images, ads, or embeds without reserved space; late-loading fonts | Set width/height on media; reserve space for ads |
| Good lab score, poor field data | Real visitors on slower phones and networks | Reduce JavaScript and page weight further |
Step 1: Turn On Page Caching
Without a cache, WordPress runs PHP and database queries for every visit. A page cache stores the finished HTML and serves it directly, which is usually the single biggest improvement to server response time.
Check your host first. Many managed hosts and LiteSpeed servers provide server-level caching, and adding a second caching plugin on top can cause conflicts. If your host does not cache pages, compare options in our guide to WordPress cache plugins. Exclude cart, checkout, and account pages if you run a store.
Step 2: Fix Images, Especially the Largest One
On most blog posts the LCP element is the featured image or the first large image. WordPress already helps here: since version 6.3 it adds fetchpriority="high" to the image it judges most likely to be the LCP element and avoids lazy-loading it.
What you still need to do:
- Resize images to the size they are displayed at, not the camera original.
- Use modern formats. WordPress supports WebP and, since WordPress 6.5, AVIF (if your server’s image library supports it).
- Make sure your theme or optimization plugin does not lazy-load the first image above the fold.
Our guides on optimizing images for WordPress and lazy loading cover the details.
Step 3: Run a Supported PHP Version
WordPress.org recommends PHP 8.3 or newer. According to the PHP project’s support schedule, PHP 8.2 stops receiving security fixes at the end of 2026, so sites on 8.2 or older should plan an upgrade now.
Newer PHP versions are generally faster as well as safer. Test the upgrade on a staging copy first, because old plugins and themes are the usual source of PHP compatibility errors.
Step 4: Reduce JavaScript and CSS
JavaScript is the main cause of poor INP. Every slider, chat widget, social feed, and page-builder module adds scripts that the browser must download and run.
- List every active plugin and ask what each one does for visitors.
- Remove plugins you no longer need, and replace heavy ones with lighter alternatives.
- Load scripts only on pages that need them (for example, a contact form script only on the contact page).
- Defer or delay non-essential scripts such as chat widgets and analytics add-ons.
- Minify CSS and JavaScript, but test carefully: aggressive “combine” settings can break layouts.
Step 5: Use a CDN for Static Files
A content delivery network serves images, CSS, and JavaScript from servers closer to each visitor, which helps most when your audience is spread across countries. Our WordPress CDN setup tutorial walks through the configuration.
Step 6: Use What WordPress Core Already Does
Recent WordPress versions include performance features that older optimization guides tell you to add with plugins:
| Feature | Added in | What it does |
|---|---|---|
| Native image lazy loading | WordPress 5.5 | Adds loading="lazy" to images below the fold |
Automatic fetchpriority on the LCP image | WordPress 6.3 | Tells the browser to load the main image early |
| AVIF upload support | WordPress 6.5 | Allows smaller image files where the server supports AVIF |
| Speculative loading | WordPress 6.8 | Prefetches likely next pages for logged-out visitors |
Before installing a plugin for any of these, check whether it duplicates a core feature. Two systems doing the same job can cancel each other out.
Step 7: Keep the Database and Background Tasks Lean
Large wp_options tables with autoloaded data from deleted plugins, thousands of post revisions, and expired transients slow down every uncached request. Clean these periodically using the steps in our WordPress database optimization guide, and always take a backup before running cleanup tools.
On low-traffic sites, consider replacing WordPress’s built-in visit-triggered cron with a real server cron job so scheduled tasks do not slow down page loads.
Common Mistakes
- Chasing a perfect lab score. A 100 in Lighthouse means little if real visitors still see slow LCP.
- Stacking optimization plugins. Two caching or minification plugins often conflict and slow the site down.
- Lazy-loading the hero image. This delays the LCP element and usually makes LCP worse.
- Changing everything at once. If something breaks or the score drops, you cannot tell which change caused it.
- Ignoring mobile. Field data is often worse on mobile, so test that view first.
FAQ
What is a good PageSpeed Insights score for WordPress?
There is no official target score. Focus on passing Core Web Vitals in field data (LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1). A lab score in the 80s with passing field data is better than a 100 lab score with failing field data.
Do I need a premium caching plugin?
Not always. If your host provides server-level caching, you may only need image optimization and script control. A free caching plugin is enough for many small sites on hosts without built-in caching.
Why does my site score well in lab tests but fail Core Web Vitals?
Lab tests use one simulated device and network. Real visitors may use slower phones, slower connections, or reach pages that are not cached, which field data captures.
Does page speed affect Google rankings?
Core Web Vitals are part of the page experience signals Google’s ranking systems use, but Google states that relevant, helpful content matters more. Speed is a tiebreaker and a user-experience issue more than a shortcut to rankings.
How often should I re-test?
After every significant change, and at least monthly. Field data covers 28 days, so wait a few weeks to see the full effect of a fix.
The Bottom Line
WordPress speed optimization works best as a short, ordered checklist: measure with field data, cache pages, fix the largest image, keep PHP current, cut unnecessary JavaScript, and serve static files from a CDN. On many sites, the first three steps make the largest difference. Re-test after each change and keep only what improves real-user data.
Sources & Further Reading
- web.dev: Web Vitals
- web.dev: Interaction to Next Paint becomes a Core Web Vital on March 12
- Google for Developers: About PageSpeed Insights
- Google Search Central: Understanding Core Web Vitals and Google search results
- WordPress.org: Requirements
- PHP: Supported Versions
- Make WordPress Core: Image performance enhancements in WordPress 6.3
- Make WordPress Core: WordPress 6.5 adds AVIF support
- Make WordPress Core: Speculative Loading in 6.8
Jackober uses AI tools for research, drafting, and editing. Articles are editorially reviewed and factual claims are checked against cited sources. Last reviewed: October 2026.









3 comments