Step 1: Measure before you optimize
Run your site through PageSpeed Insights (pagespeed.web.dev) and write down four numbers: LCP (Largest Contentful Paint, the time until the main content appears), INP (Interaction to Next Paint, responsiveness), CLS (Cumulative Layout Shift, visual stability), and total page weight. Google's Core Web Vitals thresholds: LCP under 2.5s, INP under 200ms, CLS under 0.1. These directly affect your search rankings as of 2021. Below those thresholds is 'good'; between thresholds and 4s/500ms/0.25 is 'needs improvement'; worse is 'poor'. The whole point of WordPress speed optimization is moving these three numbers into the green zone. Don't trust GTmetrix scores or other aggregate ratings — they don't map to Google's actual signals.
Step 2: Verify your hosting isn't the bottleneck
Check TTFB (Time To First Byte) from your audience's geography using WebPageTest. If TTFB is above 1 second, your hosting is the bottleneck — no amount of front-end optimization will fix it. Common culprits: cheap shared hosting with overloaded servers, hosting in a different continent from your audience, missing PHP opcache (any PHP version 7+ should have it on by default). The cheapest fix is switching to a faster host on the same plan tier. For < 50K visits/month, Hostinger Business with LiteSpeed Cache produces sub-400ms TTFB. For higher traffic, Kinsta or WP Engine on Google Cloud premium tier produce sub-300ms TTFB consistently. Switching hosts is more work than installing a plugin but the speedup is often dramatic.
Step 3: Page caching is the biggest single optimization
By default, WordPress generates every page from PHP + MySQL on every request. Page caching stores the generated HTML and serves it directly for subsequent visitors — typically 10-20x faster. On LiteSpeed-based hosts (Hostinger, most of Bluehost, A2 Turbo, NameHero), install LiteSpeed Cache (free) — it integrates with the server-level cache. On Apache/Nginx hosts, install WP Rocket ($59/year) — it's the highest-quality caching plugin and worth the price. The free alternatives (W3 Total Cache, WP Super Cache) work but require more configuration. After enabling page caching, retest in PageSpeed Insights — you should see TTFB drop dramatically.
Step 4: Image optimization comes second
Images are typically 60-80% of a WordPress page's weight. Two wins to capture: (1) Compression — every image should be compressed before upload. Use our Image Compressor or install ShortPixel/Smush for automatic compression on upload. Target: hero images under 200KB, content images under 100KB. (2) Modern formats — serve WebP (or AVIF) instead of JPG/PNG. WebP is 25-35% smaller for equivalent quality. ShortPixel and Smush Pro both convert automatically; alternatively, Cloudflare's image optimization rewrites images on the fly. (3) Lazy loading — images below the fold should only load when scrolled into view. WordPress 5.5+ adds loading='lazy' automatically; verify it's working by viewing source. (4) Width attributes — always set explicit width/height on images to prevent CLS.
Step 5: CSS/JS minification and bundle audit
Most caching plugins (WP Rocket, LiteSpeed Cache) include CSS/JS minification — turn it on. The bigger win is deferring or removing unused scripts. Run Chrome DevTools → Coverage tab on your homepage; it shows which CSS and JS bytes are actually used. Typical results: 50-80% of CSS is unused, 30-60% of JS is unused. Solutions: (a) Use a lighter theme (GeneratePress or Kadence ship < 30KB CSS), (b) Disable unused plugins (often the source of unused scripts), (c) Use a plugin like Asset CleanUp to disable scripts on pages that don't need them (e.g., Contact Form 7 loads everywhere by default even though you only use it on /contact).
Step 6: Plugin audit — find the slow ones
Each active WordPress plugin runs on every page load, potentially adding queries, JavaScript, and CSS. Most slow sites have 30-50+ active plugins, half of which they no longer use. Use Query Monitor (free) to see which plugins make the most database queries. Use the New Relic free tier or Kinsta's APM to see which plugin functions take the longest. Top offenders historically: Jetpack (does many things, all of them at every request), bloated backup plugins running during traffic spikes, social-sharing plugins that load their CSS/JS even on pages without sharing buttons, security plugins doing real-time file scanning. Disable a plugin, retest performance, decide if the feature was worth the cost.
Step 7: Database optimization
WordPress accumulates database cruft over time: post revisions, expired transients, spam comments, orphaned metadata. Install WP-Optimize (free) and run a database cleanup once. Reasonable monthly maintenance: delete revisions older than 60 days (keep recent ones for safety), expired transients, spam queue. For high-traffic sites, the bigger database win is object caching — Redis or Memcached cache the results of expensive MySQL queries in memory, avoiding repeated work. Most managed WordPress hosts include Redis on their higher tiers; on basic shared hosting, this isn't available.
Step 8: CDN for global audiences
A CDN (Content Delivery Network) caches your static assets (images, CSS, JS) at edge locations near your visitors. For a US-only audience hosted in the US, a CDN provides modest improvement. For a global audience, a CDN is essential — it cuts asset latency from 200-500ms to 20-50ms. Cloudflare's free tier covers most needs; BunnyCDN at $0.01-0.05/GB is a paid upgrade with excellent performance. For images specifically, Cloudflare Images or Bunny Image Optimizer can resize and convert formats on the fly.
Step 9: Measure again and iterate
After each major change, re-run PageSpeed Insights. The goal is incremental progress — most sites don't go from 'poor' to 'good' in a single change. After a full optimization pass, typical results: a WooCommerce store on shared hosting goes from LCP 4-6s to LCP 1.5-2.5s. A content blog on managed hosting goes from LCP 2-3s to LCP 0.8-1.5s. If you're stuck above 3s LCP after all of the above, the bottleneck is likely your theme — switch to a lighter theme (GeneratePress, Kadence, or Astra) before optimizing further.