Why WordPress Sites Are Slow (And How to Fix Them)
WordPress powers 43% of the web, but the majority of WordPress sites suffer from poor performance. A 2024 HTTPArchive study found that the median WordPress site takes 4.2 seconds to reach LCP — well above Google's 2.5-second threshold.
The usual culprits: bloated themes with dozens of unused features, too many plugins (each adding database queries and HTTP requests), cheap shared hosting with overcrowded servers, and unoptimized databases full of revisions and transients.
Server-Level Optimizations
1. Choose the Right Hosting
Your hosting provider is the foundation of your site's performance. Shared hosting at €3/month puts your site on an overcrowded server competing with hundreds of other sites for CPU and memory.
- VPS (Recommended): DigitalOcean, Vultr, or Hetzner — starting from €5-10/month for dedicated resources
- Managed WordPress: Cloudways (VPS-based), Kinsta, or WP Engine for hands-off management
- Custom Stack: Nginx + PHP-FPM + MariaDB on Ubuntu for maximum control and performance
2. Configure PHP 8.2+ with OPcache
PHP 8.2 is up to 25% faster than PHP 7.4 for WordPress workloads. Combined with OPcache, compiled PHP scripts are cached in memory, eliminating the need to recompile on every request.
- Set
opcache.memory_consumption=256for large sites - Enable
opcache.jit=1235for PHP 8.1+ - Configure PHP-FPM worker pools based on your traffic (static pool for consistent traffic, dynamic for variable)
- Set
pm.max_childrenbased on available RAM (1 worker ≈ 40-60MB)
3. Database Optimization
WordPress databases accumulate bloat over time: post revisions, expired transients, spam comments, orphaned metadata, and auto-drafts.
- Limit post revisions:
define('WP_POST_REVISIONS', 5); - Clean expired transients monthly
- Delete spam and trashed comments
- Optimize database tables (OPTIMIZE TABLE)
- Add proper indexes for custom queries
- Consider MariaDB over MySQL — it's faster for WordPress workloads
4. Nginx Configuration
Nginx outperforms Apache for WordPress, especially for serving static files and handling concurrent connections.
- Enable Gzip/Brotli compression at the server level
- Set up FastCGI caching for full-page caching
- Configure proper cache headers for static assets (1 year for versioned files)
- Enable HTTP/2 and HTTP/3 for multiplexed connections
- Use try_files to bypass PHP for static file requests
Code-Level Optimizations
5. Eliminate Plugin Bloat
Every plugin adds PHP execution time, database queries, and often CSS/JS files on every page. The average WordPress site has 20-30 active plugins — most have too many.
- Audit every plugin: Do you actually use it? Is there a lighter alternative?
- Replace Yoast (heavy) with RankMath or SEOPress (lighter)
- Replace Elementor/WPBakery with Gutenberg + GenerateBlocks
- Write custom code for simple functionality instead of installing a plugin
- Use Query Monitor to identify slow plugins and queries
6. Image Optimization Pipeline
Images account for 50%+ of page weight on most WordPress sites.
- Use ShortPixel, Imagify, or Smush for automatic WebP conversion
- Implement responsive images with srcset (WordPress does this by default for uploads)
- Lazy load below-the-fold images (native
loading="lazy") - Set max upload dimensions to prevent 5000px images from being stored
- Serve images from a CDN subdomain
7. Implement Object Caching
WordPress makes dozens of database queries per page load. Object caching stores these query results in memory (RAM), dramatically reducing database load.
- Redis (Recommended): Persistent, supports data structures, works great with WooCommerce
- Memcached: Simpler, slightly faster for basic key-value caching
- Use the Redis Object Cache plugin for drop-in integration
- Typical result: 40-60% reduction in database queries per page
CDN & Edge Caching
Set up Cloudflare with proper page rules for WordPress:
- Cache Everything for static pages (exclude /wp-admin/, /wp-login.php)
- Enable Auto Minify for HTML, CSS, JS
- Enable Polish for automatic image optimization
- Set Browser Cache TTL to "Respect Existing Headers"
- For WooCommerce: Bypass cache for cart, checkout, and my-account pages using Cache Rules
- Enable Rocket Loader for deferred JS loading
Results You Can Expect
With these optimizations applied systematically, I consistently achieve:
- TTFB: Under 200ms (down from 1-3 seconds)
- Full Page Load: Under 1.5 seconds
- PageSpeed Score: 90-100 on both mobile and desktop
- Database Queries: Reduced by 50-70%
Need help? Let's optimize your WordPress site for peak performance.