We acquire WordPress agencies. Is yours next?

SRB/ENG

Why is my WordPress site slow? 11 real causes and what to do about them.

Why is my WordPress site slow? 11 real causes and what to do about them.

Author:

codex_audit

Table of Contents

Speed matters more than most WordPress site owners realize. Google uses Core Web Vitals as a ranking signal. Users leave slow sites. And the difference between a 1.5-second load and a 4-second load can be the difference between ranking on page one and sitting on page three for a competitive keyword.

This guide covers the 11 most common causes of a slow WordPress site, ranked roughly by how often we see them in the sites we audit.

1. Shared hosting that’s hit its ceiling

The single most common cause of a slow WordPress site isn’t a plugin or code issue, it’s the server. Shared hosting plans put dozens or hundreds of WordPress sites on the same physical server, which means your site shares CPU and RAM with everyone else. During traffic spikes, the server queues requests, and your Time to First Byte (TTFB) bloats from 200ms to 2+ seconds.

A caching plugin on shared hosting can help, but it doesn’t solve the problem. If your TTFB is consistently over 400ms even with caching enabled, the server is the bottleneck.

Fix: Move to a managed WordPress host (Kinsta, WP Engine, Cloudways) or a VPS with proper PHP-FPM configuration. Expect a 40-70% TTFB improvement from the server upgrade alone.

2. No page caching (or caching configured wrong)

WordPress is dynamic by default. Every request rebuilds the page from the database unless something is caching the output. Without caching, even a well-optimized site on good hosting will be slower than it should be.

The common failure mode isn’t missing caching entirely. It’s caching configured poorly. WP Rocket installed with default settings and no CDN integration is better than nothing, but it’s not a complete solution.

Fix: WP Rocket or LiteSpeed Cache (if on a LiteSpeed server) with Cloudflare or a CDN. Server-level caching via Nginx FastCGI Cache or Redis object caching for dynamic queries. Each layer addresses a different part of the request lifecycle.

3. Images that haven’t been optimized

Images are usually the largest files on a WordPress page. A homepage hero image saved from Canva at full resolution can be 3-8MB. Multiply that by a few images per page and you’re transferring 15-20MB of data before the user can see anything meaningful.

Modern image formats matter too. JPEG is still the most common format in WordPress uploads, but WebP images average 25-35% smaller than JPEG at equivalent quality. AVIF is smaller still, though browser support is still maturing.

Fix: Convert existing images to WebP (Imagify or ShortPixel handle this automatically). Add lazy loading for below-the-fold images. Set proper srcset attributes so mobile devices aren’t downloading desktop-sized images. For hero images, manually optimize to target under 200KB.

4. Too many plugins doing overlapping things

There’s a common misconception that the number of plugins is the problem. It isn’t, really. A site with 50 well-built plugins can outperform a site with 15 bloated ones. The issue is what the plugins are doing and whether they’re doing it efficiently.

Common culprits: plugins that load their CSS and JavaScript on every page even when only needed on specific pages, contact form plugins that pull in jQuery even when it’s already loaded, and slider plugins that load massive libraries for one animation on the homepage.

Fix: Use Query Monitor to see what each plugin is loading per page. Disable scripts and styles conditionally using wp_enqueue_scripts hooks with is_page() or is_singular() checks. Remove any plugin whose functionality can be replaced with a few lines of custom code.

5. Unoptimized database queries

WordPress makes database calls to assemble every page. A well-structured WordPress site with proper indexes makes dozens of fast queries. A poorly built site might make hundreds of slow ones, complex meta queries without indexes, N+1 query problems in page builders, or WP_Query calls pulling 1,000 posts to display three of them.

Database bloat also matters. WP_options table autoloaded data that grows to several megabytes slows every single page load because that data gets pulled into memory on init.

Fix: Query Monitor identifies slow queries in development. Clean the wp_options autoload data with WP Optimize. Add Redis object caching so repeated database calls are served from memory. For custom queries, use transients to cache expensive results.

6. Elementor or page builder bloat

Elementor is the most popular WordPress page builder and the one we work with most. It’s genuinely good. But it generates more CSS and JavaScript than hand-coded HTML, and its default configuration loads that CSS and JS globally, even on pages that don’t use it.

Elementor’s editor creates extra DOM wrappers around every widget, which adds to page size and rendering time. Sites that haven’t been configured to use Elementor’s Improved CSS Loading (per-element CSS) and Inline Font Icons are loading significantly more than they need to.

Fix: Enable Elementor’s Improved CSS Loading under Settings > Style. Enable Inline Font Icons. Use the Elementor Site Settings to load only the CSS that a given page actually needs. Avoid stacking multiple animation libraries. For high-performance requirements, consider Bricks Builder instead.

7. No CDN (or CDN misconfigured)

A CDN serves your static assets, images, CSS, JS, fonts, from servers geographically close to the visitor. Without a CDN, a user in Los Angeles hitting a server in New York adds 60-90ms of latency to every asset request. A site with 40 requests multiplies that latency 40 times.

Cloudflare is free and effective. But it needs to be configured, not just pointed at. Cloudflare’s default caching level caches very little. Without proper cache rules and page rules, you’re using Cloudflare as a DNS proxy, not as a CDN.

Fix: Enable Cloudflare, configure cache rules to cache static assets aggressively, use Cloudflare’s polish and mirage features for image optimization, and enable Argo Smart Routing if budget allows. For WooCommerce, exclude cart and checkout from caching.

8. Render-blocking scripts and stylesheets

When a browser encounters a script tag in the document head without async or defer attributes, it stops rendering the page while it downloads and executes that script. A site with five render-blocking scripts in the head can take 2-3 seconds before the browser paints anything visible to the user, even if the server responds instantly.

Google Fonts can also be a culprit, loading 4-5 font weights from Google’s servers adds DNS lookup time plus the font download itself.

Fix: Defer non-critical JavaScript. Preload critical CSS. Self-host Google Fonts with font-display: swap. WP Rocket’s “Delay JavaScript Execution” handles most of this automatically, but needs testing to ensure interactive elements don’t break.

9. WooCommerce on shared hosting

WooCommerce adds complexity to every WordPress optimization problem. Cart pages, checkout, and account pages are dynamic and can’t be fully cached. Product pages with variable products make complex queries. And WooCommerce’s session handling writes to the database on every cart interaction.

Running WooCommerce on shared hosting is a recipe for slow performance at any meaningful traffic level. The database write load alone can saturate shared hosting resources during a sale or promotion.

Fix: Managed WooCommerce hosting (Kinsta, Nexcess, WP Engine Commerce) with Redis object caching and a proper CDN configuration that excludes cart/checkout from caching. For high-volume stores, consider a dedicated database server separate from the web server.

10. Outdated PHP version

PHP 8.2 and 8.3 are meaningfully faster than PHP 7.x for WordPress. The WordPress benchmarks show 50-70% more requests per second on PHP 8.2 versus PHP 7.4 under load. Despite this, a substantial portion of WordPress sites are still running on PHP 7.4 or even older versions.

The barrier is usually plugin compatibility, some older plugins that haven’t been updated in years throw deprecation notices or fail on PHP 8+. But those plugins are a problem in themselves: outdated plugins are the leading cause of WordPress security vulnerabilities.

Fix: Test a PHP version upgrade in a staging environment first. Most modern plugins are PHP 8+ compatible. Replace any plugin that fails on PHP 8.2 – it’s unmaintained and almost certainly a security risk.

11. External scripts and third-party embeds

Every external script your site loads adds a DNS lookup, a connection, and a download, all outside your control. A typical marketing site might load: Google Analytics, Google Tag Manager (which then loads 5 more scripts), a live chat widget, a Facebook Pixel, a LinkedIn Insight Tag, Hotjar, and an Instagram embed. That’s 8+ external connections adding 200-800ms of load time that no amount of server optimization can fix.

Third-party embeds are especially damaging. An embedded YouTube video loads a 500KB iframe. An embedded Google Map adds its full Maps API load.

Fix: Route everything through Google Tag Manager so you have one external connection that loads the rest. Audit your GTM container and remove tags that aren’t actively being used. Lazy-load embeds, YouTube embeds should use a facade that only loads the real iframe when the user clicks. Use a privacy-focused, self-hosted analytics alternative like Plausible to eliminate GA overhead entirely.

How to find your actual bottleneck

Most WordPress speed guides give generic advice because they don’t know what’s actually causing your specific site’s slowness. Before you do anything, run your site through:

  • WebPageTest.org for waterfall analysis, shows exactly which resources are slow and why
  • Google PageSpeed Insights for Core Web Vitals field data and lab data
  • GTmetrix for a second waterfall view with a timeline
  • Query Monitor (WordPress plugin, free) for database query profiling

The waterfall chart tells you where time is being spent. TTFB tells you whether the server is the problem. Render-blocking resources show up clearly in the request timeline. With that data in hand, you can prioritize the fix that will move the needle most.

Need a professional speed audit?

We audit WordPress sites and produce a prioritized fix list with specific implementation steps. We also handle the implementation if you’d rather not get into the technical details yourself.

See our speed optimization service →

Related reading

Author:

codex_audit

Share:

You Read Our Blog.
Now Let’s Talk About Your Business.

Red gradient
Web design - Services
Interactive UX&UI design, innovation and challenging projects. Let’s make something cool.
Website development, WordPress website development and web shops

From WordPress to full-stack custom solutions. Your partner for front-end and back-end challenges.

Graphic design - Services

From printing and packaging to branding and digital design… We can design almost anything.

Digital Marketing - Services
Digital marketing with a clear vision: Personalized strategies that deliver results. We don’t recycle, we create.

We have a solution for all your challenges.

Start a
project

Work
With Us