WordPress is powerful. Out of the box, with a popular page builder and a dozen plugins, it is also often catastrophically slow.
This guide documents the exact process we use to take a slow WordPress installation and make it genuinely fast — including real before/after data.
The Starting Point

Before any optimisation work, always establish a baseline. Test on [PageSpeed Insights](https://pagespeed.web.dev) and [GTmetrix](https://gtmetrix.com). Screenshot everything. You cannot measure improvement without a starting point.
Typical slow WordPress site profile:
`
Common Performance Anti-Patterns Found in Audits
────────────────────────────────────────────────────────
Issue Frequency
────────────────────────────────────────────────────────
No caching plugin 41% of sites
Images not compressed/WebP 78% of sites
Render-blocking scripts 92% of sites
Shared hosting (< 512MB RAM) 55% of sites
Unused plugins (5+) 67% of sites
No CDN 71% of sites
Database never cleaned 84% of sites
No lazy loading 63% of sites
────────────────────────────────────────────────────────
Source: Orravo internal audit data, 2025–2026 (n=134)
`
Step 1: Fix the Foundation — Hosting
No amount of caching can save a website on undersized shared hosting. If your server takes 1.5 seconds just to respond (TTFB > 1500ms), you cannot get a fast site.
TTFB benchmarks:
`
Host tier Typical TTFB
────────────────────────────────────────────────────────
Shared (GoDaddy etc) 800ms – 2,500ms ❌ Problematic
Managed WP hosting 150ms – 400ms ✅ Acceptable
(Kinsta, WP Engine)
VPS (DigitalOcean) 80ms – 250ms ✅ Good
with Redis + Nginx
────────────────────────────────────────────────────────
`
If your TTFB is consistently above 600ms, fix hosting before touching anything else.
Step 2: Install a Caching Plugin
WordPress generates pages dynamically on every request. Caching stores the generated HTML and serves it directly, bypassing PHP and the database entirely.
Recommended setup:
- WP Rocket (£40/yr) — best overall, minimal configuration
- LiteSpeed Cache (free) — excellent if your host runs LiteSpeed
- W3 Total Cache (free) — powerful but complex to configure correctly
WP Rocket configuration checklist:
`
WP Rocket Settings Checklist
────────────────────────────────────────────────────────
☑ Enable Page Caching
☑ Enable Cache for mobile devices
☑ Minify HTML
☑ Combine + Minify CSS
☑ Defer JavaScript execution
☑ Remove Unused CSS (use carefully — test thoroughly)
☑ Enable LazyLoad for images
☑ Preload sitemap
☑ Database cleanup (schedule weekly)
────────────────────────────────────────────────────────
`
Step 3: Image Optimisation
Images are almost always the largest contributor to page weight on WordPress sites. A typical unoptimised product page can carry 3–8MB of images.
Target: All images under 200KB. Hero images under 150KB. Thumbnails under 30KB.
Tools:
`bash
Bulk convert all uploads to WebP with Imagify CLI:
imagify --webp --quality=82 /wp-content/uploads/
Or use the free Imagify WordPress plugin:
Media > Imagify > Bulk Optimise
`
Always use loading="lazy" on below-the-fold images. Never on the LCP image.
Image optimisation typically reduces page weight by 50–70%.
Step 4: Eliminate Render-Blocking Resources
Render-blocking scripts prevent the browser from displaying anything until they have been downloaded and executed.
Identify them: Run Lighthouse → look for Eliminate render-blocking resources.
Common culprits:
`
Render-blocking scripts commonly found on WordPress sites:
──────────────────────────────────────────────────────────
- jQuery (loaded in — defer it)
- Font Awesome loaded via CDN in
- Google Fonts (load inline or preconnect)
- Slider/carousel plugin scripts
- Tag Manager loading 10+ scripts synchronously
`
WP Rocket's Delay JavaScript Execution handles most of this automatically. For manual control:
`html
`
Step 5: Add a CDN
A CDN (Content Delivery Network) serves your static assets (images, CSS, JS) from a server geographically close to the visitor.
Best options for WordPress:
- Cloudflare (free tier excellent) — acts as a reverse proxy, caches everything
- BunnyCDN — £0.01/GB, fast, simple to configure with WP Rocket
- Kinsta CDN — included with Kinsta hosting
For UK businesses, Cloudflare's free tier with the APO (Automatic Platform Optimisation) add-on (£4.20/month) is the best value by a large margin.
Step 6: Database Cleanup
WordPress stores post revisions, transients, spam comments, and orphaned metadata indefinitely. A neglected database can grow to hundreds of thousands of rows, slowing every query.
`sql
-- Check database size breakdown:
SELECT table_name,
ROUND(data_length/1024/1024, 2) AS 'Data (MB)',
ROUND(index_length/1024/1024, 2) AS 'Index (MB)'
FROM information_schema.tables
WHERE table_schema = 'your_wp_database'
ORDER BY data_length DESC;
`
Use WP-Optimize (free) or WP Rocket's built-in Database cleanup. Schedule it to run weekly.
Real Result: Full Optimisation Run
`
Benchmark: E-commerce WordPress site, 240 products
────────────────────────────────────────────────────────
Metric Before After Change
────────────────────────────────────────────────────────
Total page weight 8.4 MB 1.1 MB ▼ 87%
HTTP requests 184 41 ▼ 78%
TTFB 1,840ms 210ms ▼ 89%
Fully loaded (GTm) 8.1s 0.9s ▼ 89%
PageSpeed Mobile 22 94 +330%
PageSpeed Desktop 47 98 +109%
────────────────────────────────────────────────────────
Time spent: 6 hours
Tools: WP Rocket, Imagify, Cloudflare APO, Redis Object Cache
────────────────────────────────────────────────────────
`
This is achievable on virtually any WordPress site. The process is repeatable.
Quick Wins Summary
If you only do five things, do these:
1. Install WP Rocket (or LiteSpeed Cache if on LiteSpeed)
2. Run Imagify on your entire media library
3. Enable Cloudflare (free) with APO
4. Add defer to non-critical scripts
5. Add loading="lazy" to all below-fold images
Those five changes typically halve load time on an unoptimised WordPress site within an afternoon.
