Most WordPress sites are slow for the same three reasons, in the same order, every time. Hosting is rarely one of them. We have audited dozens of WordPress installs on cheap shared hosts that scored 95 on Lighthouse, and others on the most expensive managed hosts in the market that scored 38. The host is rarely the bottleneck.
Here are the three real bottlenecks, what to do about each, and what to expect after.
1. The theme
Most WordPress themes shipped between 2018 and 2023 were optimised for the page-builder ecosystem: Elementor, Divi, WPBakery, Beaver. These themes work by shipping a CSS framework that supports every block type the builder could possibly render, a JavaScript runtime that interprets the builder's output at runtime, and a custom rendering pipeline that bypasses the WordPress block editor.
The result is 600KB to 1.2MB of CSS and JavaScript shipped on every page, before any of your actual content. On a mid-range Android phone over 4G, that loads in three to five seconds. Lighthouse hates it. Google does too.
The fix is structural. Replace the theme with a block-native theme: one that uses the Gutenberg block editor, ACF for structured fields, and zero page-builder overhead. The result on a 30-page site is usually a 60% drop in JavaScript and a 40% drop in CSS.
A good shortlist of block-native themes for 2026: GeneratePress, Blocksy, and the custom themes we build at MindScrollers using @wordpress/create-block-theme as the base.
2. The plugins
The average WordPress install has 30+ active plugins. Each plugin loads its own CSS and JavaScript on every page where its features are enabled. Most of those features are not used on most pages.
Audit:
- List every active plugin.
- For each one, write down what feature it provides and how often that feature actually runs.
- Identify duplicates: most sites have three SEO plugins, two security plugins, and four caching plugins. Pick one of each, delete the rest.
- For plugins that only load their feature on a handful of pages, use a plugin like Asset CleanUp or Perfmatters to dequeue the asset everywhere else.
Typical result: 30 plugins becomes 14. Page weight drops another 20-30%.
3. The images
WordPress now serves WebP and AVIF natively, but most installs are not configured to use them. The image library still contains 2MB JPEGs from 2019, and the front end loads them at full size into 800-pixel-wide containers.
Fix:
- Bulk convert every image in the media library to WebP. Plugin: ShortPixel or Smush, run once on the existing library, then enable automatic conversion for new uploads.
- Enable native lazy loading on all images except the LCP candidate (the hero image at the top of the page).
- For the LCP candidate, set
fetchpriority="high"and ensure the image is served at the correct size for the viewport.
This alone often shaves 1.5 seconds off LCP on mobile.
What about caching?
Caching matters. It is just not the first lever to pull.
A caching plugin like WP Rocket or LiteSpeed Cache, configured correctly, will give you a 30-50% improvement on top of a fast theme. It will give you a 5-10% improvement on top of a slow theme, and a bad configuration can actively make things worse (cached stale assets, broken cart pages, etc.).
Order of operations:
- Theme audit and replacement.
- Plugin audit and pruning.
- Image optimization.
- Then turn on caching.
Reverse this order and you are caching the output of a slow site, which is just a slow site that is slow in fewer locations.
Hosting
Hosting matters most when the database is heavy: 50,000+ posts, 100+ concurrent users at peak, heavy WooCommerce traffic. For a typical 50-page brand site, any reputable host with PHP 8.2+ and OPcache enabled performs identically.
What does matter regardless of host:
- HTTP/2 or HTTP/3 enabled.
- Brotli compression on text responses.
- A CDN in front of static assets. Cloudflare's free tier is enough for most brand sites; for ecommerce or high-traffic publications, BunnyCDN or Fastly.
- Disable XML-RPC and limit login attempts. Not a performance fix, but a stability one: brute-force traffic on
/xmlrpc.phpwill tank a small site under load.
Measuring honestly
Run Core Web Vitals on the real production site, on a mid-range Android device, on 4G. Not on a desktop laptop on home WiFi. The discrepancy between desktop and mobile scores is the entire performance story on most WordPress sites.
The numbers to track:
- LCP: < 2.5s on mobile. < 2.0s if you can hit it.
- INP: < 200ms on mobile.
- CLS: < 0.1.
If you score 90+ on Lighthouse mobile, you are in the top 5% of WordPress sites by performance. Most agencies and freelancers cannot hit this number, even on small brand sites.
What this looks like with us
We rebuild WordPress sites against the budget above as a flat-priced project. A typical 30-page site clears 95 Lighthouse mobile inside 8 weeks. The full process is documented on the WordPress development service page.
If you want it diagnosed rather than guessed at, the $890 site teardown returns the Vitals snapshot, the theme and plugin diagnosis, and the fixes ranked by what each one buys you.

