How I Boosted a WordPress Site Speed from 42 to 91 — Without Changing the Design
Page speed is not just a vanity metric. It directly affects bounce rate, conversion rate, user experience — and since Google's Core Web Vitals update, it's a ranking factor too. When a client came to me with a WordPress site scoring 42 on Google PageSpeed Insights, I knew there was a lot of room to improve — without a full redesign.
In this article I'll walk through the exact process I used to take that site from 42 to 91 on mobile, and from 58 to 96 on desktop. No design changes. No new theme. Just smart optimisation.
Step 1 — Diagnose First, Fix Second
Before touching anything, I ran a full audit using three tools:
- Google PageSpeed Insights — for Core Web Vitals data (LCP, INP, CLS)
- Screaming Frog — to find render-blocking resources and unoptimised images
- Chrome DevTools Network tab — to see exactly what was loading and in what order
The main culprits were: unoptimised images (averaging 800KB per image), 14 plugins loading JavaScript on every page, render-blocking CSS from an unused page builder, and no caching configuration.
Step 2 — Image Optimisation
Images were the biggest win. The site had over 200 images, none of them compressed or converted to modern formats. Here's what I did:
- Installed ShortPixel to bulk-convert all existing images to WebP
- Added
loading="lazy"anddecoding="async"to all images below the fold - Used
srcsetto serve appropriately sized images to different viewports - Set explicit
widthandheightattributes on all images to eliminate CLS
This alone took the LCP from 8.2 seconds to 3.1 seconds.
Step 3 — Caching Setup
The site had no caching at all — every page request was hitting PHP and MySQL every time. I configured WP Rocket with:
- Page caching enabled with preloading
- Browser caching for static assets (1 year for images, CSS, JS)
- GZIP compression
- Database optimisation scheduled weekly
Step 4 — Eliminate Render-Blocking Resources
This is where most developers lose time. The site was loading 14 JavaScript files and 8 CSS files on every page — even ones that were only needed on specific pages. I:
- Used Asset CleanUp Pro to disable plugin CSS/JS on pages that didn't need them
- Deferred all non-critical JavaScript
- Inlined critical CSS for above-the-fold content
- Removed a page builder that was loading 200KB of CSS on every page (replaced with clean HTML/CSS for those templates)
// functions.php — defer non-critical JS
function defer_non_critical_scripts($tag, $handle) {
$defer = ['slider-js', 'animations-js', 'social-share'];
if (in_array($handle, $defer)) {
return str_replace(' src', ' defer src', $tag);
}
return $tag;
}
add_filter('script_loader_tag', 'defer_non_critical_scripts', 10, 2);
Step 5 — Server-Level Improvements
The site was on shared hosting. After the code-level optimisation I moved it to a VPS on Kinsta, which uses Google Cloud infrastructure. This gave us:
- Server response time under 200ms (TTFB)
- Built-in CDN via Cloudflare
- PHP 8.2 (the site was still on PHP 7.4)
- Redis object caching
The Result
After all of the above, the PageSpeed score went from 42 → 91 on mobile and 58 → 96 on desktop. LCP dropped from 8.2s to 1.4s. CLS dropped from 0.28 to 0.01. The client saw a 23% reduction in bounce rate within 30 days.
The best part? The client's design team noticed nothing had changed visually. Same site, dramatically faster.
If your WordPress site is scoring below 70, the steps above will almost always move the needle significantly. The order matters — fix images and caching first, as they're the highest-impact changes. Then tackle render-blocking resources. Server improvements are the last mile.
Need help with your site's performance? Get in touch and I'll run a free audit.