WordPress powers 40% of the web, and a lot of it is slow. The problem isn't WordPress itself - it's the themes, plugins, and configurations that pile up over time.
I've seen WordPress sites go from a score of 25 to 85+ without changing themes or losing functionality. This guide shows you how to fix the most common issues affecting LCP, CLS, and INP.
The usual suspects
Before diving into fixes, here's what typically kills WordPress performance:
- Too many plugins - Each plugin adds CSS, JavaScript, and database queries
- Unoptimized images - Large images uploaded straight from cameras
- No caching - WordPress generates pages dynamically on every request
- Render-blocking resources - CSS and JS in the
<head>that block painting - Heavy themes - Page builders and feature-rich themes with bloated code
Fix 1: Caching (the biggest win)
Without caching, WordPress runs PHP and database queries for every page view. With caching, it serves pre-built HTML files. This alone can cut load times by 80%.
Recommended plugins (pick one):
- WP Super Cache - Free, simple, works
- W3 Total Cache - More options, steeper learning curve
- WP Rocket - Paid, but easiest to configure and most complete
If you're on managed WordPress hosting (Kinsta, WP Engine, Flywheel), caching is usually built in. Don't add another caching plugin on top.
Basic WP Super Cache setup:
- Install and activate
- Go to Settings → WP Super Cache
- Turn on "Caching On"
- Select "Expert" delivery method (uses mod_rewrite, fastest option)
Fix 2: Optimize images
Images are typically the biggest files on a WordPress page. Optimizing them is essential.
Step 1: Install an optimization plugin
- ShortPixel - Compresses existing and new uploads, has a free tier
- Imagify - Similar to ShortPixel, integrates with WP Rocket
- Smush - Free option, less aggressive compression
Step 2: Enable WebP
Most image plugins can convert to WebP automatically. Enable it:
ShortPixel → Settings → Advanced → WebP Images → Create WebP versions
Step 3: Set up lazy loading
WordPress 5.5+ has native lazy loading. Make sure it's not disabled:
// Don't add this - it disables lazy loading
// add_filter( 'wp_lazy_loading_enabled', '__return_false' );
For your LCP image (usually the hero), you may want to disable lazy loading:
// In your theme's functions.php or a custom plugin
add_filter('wp_img_tag_add_loading_attr', function($value, $image, $context) {
// Disable lazy loading for the first image in post content
static $first = true;
if ($first && $context === 'the_content') {
$first = false;
return false;
}
return $value;
}, 10, 3);
Fix 3: Reduce render-blocking resources
Plugins and themes often dump CSS and JavaScript into <head>, blocking the page from rendering.
Option 1: Autoptimize (free)
Autoptimize combines and minifies CSS/JS files:
- Install Autoptimize
- Enable "Optimize JavaScript Code"
- Enable "Optimize CSS Code"
- Enable "Aggregate CSS-files"
Option 2: Asset CleanUp (free, more control)
Asset CleanUp lets you disable specific CSS/JS files on specific pages:
- Install Asset CleanUp
- Edit a page
- Scroll to Asset CleanUp section
- Unload CSS/JS that isn't needed on that page
Common candidates to unload:
- Contact Form 7 CSS/JS on non-contact pages
- WooCommerce scripts on non-shop pages
- Slider scripts on pages without sliders
Option 3: Defer JavaScript
Add defer to non-critical scripts. WP Rocket does this automatically. Manually:
// functions.php
add_filter('script_loader_tag', function($tag, $handle) {
$defer_scripts = ['jquery', 'contact-form-7', 'slider-plugin'];
if (in_array($handle, $defer_scripts)) {
return str_replace(' src', ' defer src', $tag);
}
return $tag;
}, 10, 2);
Fix 4: Eliminate plugin bloat
Every plugin adds overhead. Audit yours ruthlessly.
Step 1: List active plugins
Go to Plugins → Installed Plugins. Count them. If you have more than 20, you probably have redundancy.
Step 2: Check plugin impact
Install "Query Monitor" temporarily. It shows:
- Database queries per plugin
- Scripts/styles loaded per plugin
- Time spent per plugin
Step 3: Consolidate or remove
Common replacements:
- 3 SEO plugins → Just use Yoast or RankMath
- 5 security plugins → Just use Wordfence or Sucuri
- Multiple social share plugins → One lightweight option or custom code
Plugins to avoid or replace:
| Heavy Plugin | Lighter Alternative |
|---|---|
| Elementor | GenerateBlocks, Gutenberg |
| Jetpack (full) | Jetpack Boost (slim) |
| Revolution Slider | Native carousel or static hero |
| WPBakery | Gutenberg blocks |
Fix 5: Optimize fonts
Custom fonts add HTTP requests and can cause layout shift.
Option 1: Self-host Google Fonts
Use the "OMGF" (Optimize My Google Fonts) plugin:
- Install OMGF
- It automatically downloads and serves fonts locally
- Reduces external requests and improves privacy
Option 2: Use system fonts
The fastest font is no font:
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Helvetica Neue", Arial, sans-serif;
}
System fonts load instantly with zero CLS.
Option 3: Preload critical fonts
// functions.php
add_action('wp_head', function() {
echo '<link rel="preload" href="/wp-content/themes/yourtheme/fonts/main.woff2" as="font" type="font/woff2" crossorigin>';
}, 1);
Fix 6: Database optimization
Over time, WordPress databases accumulate cruft - revisions, transients, spam comments, orphaned meta.
WP-Optimize cleans this up:
- Install WP-Optimize
- Run cleanup (removes revisions, drafts, spam, transients)
- Optimize tables
- Schedule weekly cleanup
Limit revisions:
Add to wp-config.php:
define('WP_POST_REVISIONS', 5); // Keep only 5 revisions per post
Quick wins checklist
LCP
- Enable page caching
- Compress and convert images to WebP
- Disable lazy loading on hero image
- Preload critical fonts
CLS
- Set explicit image dimensions
- Self-host or preload fonts
- Reserve space for ads
INP
- Defer non-critical JavaScript
- Remove unused plugins
- Use Asset CleanUp to unload scripts per-page
Recommended plugin stack
Here's a lean, effective performance stack:
- Caching: WP Super Cache (free) or WP Rocket (paid)
- Images: ShortPixel
- CSS/JS: Autoptimize or Asset CleanUp
- Database: WP-Optimize
- Fonts: OMGF (if using Google Fonts)
That's it. Five plugins, major performance gains.
Frequently Asked Questions
Why is WordPress so slow?
WordPress itself isn't slow - the bloat comes from plugins, heavy themes, unoptimized images, and lack of caching. A minimal WordPress install with good hosting is actually quite fast.
What's the best caching plugin for WordPress?
WP Super Cache is free and effective. WP Rocket is paid but easier to configure and more comprehensive. If you're on managed hosting (Kinsta, WP Engine), use their built-in caching instead.
How many plugins is too many?
There's no magic number, but if you have 20+ active plugins, you likely have redundancy. Use Query Monitor to see which plugins add the most overhead, then consolidate or remove the heavy ones.
Should I use a page builder for performance?
Page builders like Elementor and WPBakery add significant overhead. GenerateBlocks or native Gutenberg blocks are much lighter alternatives. If you must use a page builder, WP Rocket helps mitigate the performance hit.
Does WordPress hosting affect Core Web Vitals?
Yes, significantly. Cheap shared hosting often has slow TTFB (time to first byte), which directly impacts LCP. Managed WordPress hosts like Kinsta, WP Engine, and Cloudways offer better performance out of the box.
What's next
Want to see exactly where your WordPress site is losing points? Run it through PageSpeedFix - we'll identify the specific issues and prioritize them by impact.