1. The “Kitchen Sink” Plugin Stack
The absolute primary performance killer is the sheer volume of bloated, inefficient plugins. Many developers use heavyweight, all-in-one plugins for simple tasks that could be handled with a single, lean function.
- The Fix: If it can be done with 10 lines in
functions.phpor a snippet manager, do it there. Avoid “Swiss Army Knife” plugins that load entire frameworks for a small featureset.
2. Excessive Autoloaded Options (wp_options)
Every time WordPress boots, it loads rows from wp_options where autoload = 'yes'. If this dataset exceeds 1-2MB, you are introducing severe latency before the application layer even executes.
- The Fix: Query your options table. Identify third-party plugin data that is rarely accessed and switch
autoloadtono.
3. Ignoring the Critical Rendering Path (CRP)
Loading all CSS and JS files synchronously in the <head> is a rendering catastrophe. It halts the browser’s parser and results in high FCP (First Contentful Paint) and LCP (Largest Contentful Paint) times.
- The Fix: Implement Critical CSS (inline it), defer all non-essential scripts, and ensure all third-party scripts include
asyncordefer.
4. Over-Reliance on Admin-Ajax for Frontend Queries
admin-ajax.php is inherently slow. Because it boots the entire WordPress core and runs all hooks, every frontend request it handles suffers from high overhead.
- The Fix: For public, non-user-specific data, use custom REST API endpoints, which are faster. If you must use Admin-Ajax, cache the response in the Object Cache.
5. Running Native WordPress Cron on Page Load
The default DISABLE_WP_CRON setting is false. This means every page view triggers a check to see if scheduled tasks (like backups or published posts) are due, which blocks the user’s request.
- The Fix: Disable the native WP-Cron in
wp-config.phpand set up a system-level crontab on the server that runs every minute.
6. Poorly Optimized Database Queries
Page builders and complex themes often create massive nested queries or JOINs that make the MySQL server gasp.
- The Fix: Use a query profiler (like Query Monitor) to find slow queries. Cache the results of complex queries using
set_transient()or, preferably, the persistent Object Cache.
7. Unoptimized Image Delivery
Using a modern format like WebP is useless if you are still serving a 4000px image inside a 300px container.
- The Fix: Ensure proper
srcset(responsive images) implementation so the browser downloads only the dimension required. If your theme doesn’t generate correct sizes, register them withadd_image_size().
8. Slow DNS and Third-Party API Calls
The most expensive operations are external. DNS lookups take time, and calling a slow third-party API (like for a social media feed) synchronously can lock the entire page render.
- The Fix: Use Cloudflare or an enterprise DNS provider to reduce lookup times. Third-party API results must be stored locally via Transients, or loaded via JS/AJAX after the DOM is ready.
9. Not Using persistent Object Caching
This is non-negotiable for high-traffic sites. If you aren’t using Redis or Memcached, you are forcing the database to rebuild the post object, term metadata, and user data on every single request.
- The Fix: Configure a persistent Object Cache. This reduces database load by 90%+ and drops TTFB significantly.
10. Bloated DOM Structure
Deeply nested, redundant DOM elements slow down the browser’s style calculation and layout rendering (reflows). This is the hallmark of visual page builders.
- The Fix: Keep the DOM size lean (aim for <1500 nodes). Manually code performance-critical sections (headers, product loops) rather than relying on builder elements.