Most WordPress speed advice is a list of thirty tips with no indication of which ones matter. In practice, three or four issues cause the overwhelming majority of slow sites, and the rest is rounding error.
Here they are, ordered by how much difference they actually make.
First, measure properly
Before changing anything, get a baseline from PageSpeed Insights. Test the mobile score, not desktop — mobile is what Google uses for ranking, and it is always the worse number.
Write down your Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS). Those three are the Core Web Vitals, and they are what actually matter. A green "performance score" with a failing LCP is not a pass.
The three that cause most slow sites
1. Cheap shared hosting
This is the number one cause and the one people are most reluctant to accept, because they are paying $3 a month and it feels like a bargain.
On oversold shared hosting your site competes for CPU with hundreds of others. Server response time (TTFB) goes above 800ms before your site has done anything at all. No plugin fixes this.
Fix: move to decent managed hosting. Expect $15–$30 a month. Target a TTFB under 300ms. This single change often improves LCP by a full second or more.
2. Unoptimised images
The second biggest cause, and the easiest to fix. A 4MB camera photo displayed at 800px wide is downloading roughly forty times more data than needed.
Fix, in order of impact:
- Resize images to the largest size they actually display at, before uploading.
- Serve WebP or AVIF instead of JPEG or PNG. Typically 25–50% smaller at the same quality.
- Compress everything. TinyPNG, ShortPixel, or Imagify.
- Add
loading="lazy"to below-the-fold images — but never to your hero image, which will hurt LCP. - Set explicit
widthandheightattributes. This alone often fixes CLS.
3. Too many plugins, or the wrong ones
Plugin *count* matters less than what they do. Five lightweight plugins are fine. One badly built slider or page builder can add 900KB.
The usual offenders: heavy page builders, sliders, "all-in-one" security suites, social feed widgets, chat widgets, related-post plugins that run uncached queries.
Fix: deactivate plugins one at a time, retest, and note the difference. Anything that costs more than 100ms and is not essential should go.
If you only do three things: move off cheap hosting, compress your images, and remove your slider. That covers most of the gap for most sites.
The next tier
4. No caching
Without caching, WordPress rebuilds every page from the database on every visit. Page caching turns that into serving a static file.
Fix: WP Rocket if you will pay, LiteSpeed Cache if your host supports it, or the free FlyingPress alternatives. Most managed hosts include server-level caching that is better than any plugin.
5. Render-blocking CSS and JavaScript
The browser stops rendering until it has loaded and processed these files.
Fix: defer non-critical JS, inline critical CSS, and remove CSS and JS that is loading on pages that do not use it. Most caching plugins do this reasonably well.
6. No CDN
If your server is in Germany and your visitors are in Australia, every request crosses the planet.
Fix: Cloudflare's free tier handles this for most small sites.
7. Google Fonts loaded badly
Each font file is a separate request to an external domain. Four weights of two families is eight files.
Fix: self-host the fonts, use font-display: swap, and load only the weights you actually use. Two weights of one family is usually enough.
8. A bloated theme
Multipurpose themes ship with code for hundreds of features you do not use.
Fix: this is a rebuild decision, not a tweak. If the theme is the bottleneck, a lightweight custom build pays for itself.
9. Bloated database
Post revisions, expired transients, spam comments, and orphaned data from deleted plugins accumulate over years.
Fix: WP-Optimize or similar. Back up first. Limit revisions in wp-config.php:
define( 'WP_POST_REVISIONS', 5 );
10. Third-party scripts
Analytics, chat widgets, ad pixels, heatmaps, review embeds. Each one is a request to someone else's server, and you cannot control how fast it responds. This is one of the most common causes of poor INP.
Fix: audit them. Every one you cannot tie to a business decision should go.
11. Old PHP
PHP 8.2 is significantly faster than PHP 7.4, and 7.4 has been unsupported since 2022.
Fix: upgrade in your host's control panel. Test on staging first — very old plugins occasionally break.
A realistic order of work
- Test on mobile, record LCP, INP and CLS.
- Check TTFB. Above 600ms, fix hosting before anything else.
- Compress and resize every image, convert to WebP.
- Add explicit width and height to images.
- Install caching.
- Audit plugins, remove what is not earning its weight.
- Turn on Cloudflare.
- Self-host fonts, cut unused weights.
- Retest and compare against your baseline.
Steps 2–4 alone typically move a site from a failing LCP to a passing one.
If you would rather not do this yourself, performance work is part of every build we do — see web development services — and our Core Web Vitals guide explains what the three metrics actually measure.