Why WordPress sites slow down

WordPress is flexible, which is one reason it powers over 40% of the web. But that flexibility comes at a price. Themes load dozens of scripts and stylesheets. Plugins add more. Every page request runs PHP code, queries a database, and assembles a response from scratch. Without caching or any optimisation, even a modest blog can feel sluggish.

The most common culprits are:

  • Unoptimised images — photos uploaded straight from a phone or camera at 5MB each, displayed at 300 pixels wide
  • No page caching — every visitor triggers a fresh database query instead of being served a pre-built HTML file
  • Cheap shared hosting — your site shares server resources with hundreds of others; when they're busy, you're slow
  • Too many plugins — each one adds weight, and some load scripts on every page regardless of whether they're needed
  • No content delivery network (CDN) — your files are served from one location, often far from your visitors

None of these are unusual. They're just the natural state of a WordPress site that hasn't been tuned. This guide works through each one in order of impact.

Measure first: PageSpeed Insights and GTmetrix

Before you change anything, get a baseline score so you can measure whether your changes are actually working. Two free tools are worth bookmarking.

Google PageSpeed Insights (search "PageSpeed Insights") tests your URL against Google's real-world data and gives you a score from 0 to 100 for both mobile and desktop. Crucially, it tells you which specific issues are dragging your score down, listed by estimated impact. This is your primary source of truth because Google uses the same signals for search rankings.

GTmetrix (gtmetrix.com) gives a more detailed waterfall view, showing exactly which files are loading, in what order, and how long each one takes. It's particularly useful for spotting render-blocking scripts and oversized images.

Action: Run your homepage through both tools now and take a screenshot of your scores. Do the same again after each change in this guide. A meaningful improvement is usually 10 to 20 points on PageSpeed Insights, though the exact number matters less than the real-world load time figure.
Common mistake: Testing only your homepage. Your product or service pages often have more content and load more slowly. Test those too, especially any page where you want visitors to take action.

Hosting: the biggest factor most ignore

No amount of optimisation can fully compensate for genuinely slow hosting. If your server takes 1.5 seconds just to respond to a request before the browser has even started loading anything, you're starting from behind.

Most small business owners in the UK start on shared hosting at around £3 to £8 a month. This is fine when your site is new and low traffic. As your site grows, you'll notice it. The tell-tale sign is a high "Time to First Byte" (TTFB) in GTmetrix, typically over 600ms.

If your PageSpeed score is poor and your TTFB is consistently high, no amount of caching plugins will fix it completely. The options are:

  • Move to a managed WordPress host — providers like Kinsta, WP Engine, or Cloudways are built specifically for WordPress and include server-level caching. They typically start at £25 to £40 a month, which is worth it once your site is generating revenue.
  • Upgrade your plan with your existing host — most hosts offer a VPS or cloud option with dedicated resources. Ask your host what your current TTFB is and what a higher plan would look like.
Common mistake: Installing a caching plugin and assuming hosting doesn't matter. Caching helps, but it cannot fix a server that takes over a second to respond. Check your TTFB first.

Caching plugins: the highest impact per minute of effort

Caching is the single most effective thing you can do for a WordPress site on a limited budget. Instead of building each page from scratch every time someone visits, a caching plugin saves a pre-built HTML copy and serves that instead. The difference is often dramatic: a page that took 3 seconds drops to under a second.

The main options are:

Free tier available
WP Rocket

The most popular paid caching plugin. It's not free (around £49 a year for one site), but it's the easiest to configure and handles page caching, browser caching, lazy loading, and minification all in one. If you want to make the biggest improvement with the least technical fiddling, this is it. Search "WP Rocket" to find it.

Free
LiteSpeed Cache

A very capable free plugin, particularly powerful if your host runs LiteSpeed web server (many UK hosts do). It covers page caching, image optimisation, CDN integration, and database optimisation. If your budget is tight, start here. Install it from the WordPress plugin directory.

Free
W3 Total Cache / WP Super Cache

Both are free and widely used. W3 Total Cache offers more settings but requires more configuration. WP Super Cache is simpler. Either works well on standard shared hosting. If you're new to caching, WP Super Cache is easier to set up without accidentally breaking anything.

Action: Install one caching plugin only (not multiple at once) and use the default settings to start. Re-test in PageSpeed Insights after enabling it. Only adjust advanced settings if the basics haven't made a significant difference.
Common mistake: Installing two or three caching plugins simultaneously. They conflict with each other and can break your site. Pick one and stick with it.

Image optimisation: compression, lazy loading, and WebP

Images are typically the biggest files on any web page, and they're almost always the biggest opportunity for improvement. A photo uploaded directly from a phone at its original size might be 4MB or more. The same image, properly optimised, can be under 100KB with no visible quality difference to the human eye.

Compression

Two plugins make image compression straightforward:

Free tier available
Smush

Compresses images automatically when you upload them and can bulk-process your existing media library. The free version covers most use cases. It's one of the most installed plugins in the WordPress directory for good reason.

Free tier available
ShortPixel

Offers both lossy and lossless compression. The free plan gives you 100 images a month, which is enough to get started on an existing site. ShortPixel also converts images to WebP format automatically, which browsers like Chrome load faster than JPEG or PNG.

WebP conversion

WebP is a modern image format that produces smaller files at the same visual quality as JPEG or PNG. Chrome, Firefox, and Safari all support it. Both Smush and ShortPixel can convert your images to WebP and serve them to browsers that support it, with fallbacks for any that don't.

Lazy loading

Lazy loading means images below the fold (below what's visible on screen when the page first loads) are not fetched until the visitor scrolls to them. WordPress has had native lazy loading built in since version 5.5, so you may already have this. WP Rocket and LiteSpeed Cache both extend this to other media types too.

Action: Install Smush or ShortPixel, run a bulk optimisation of your existing media library, and check that WebP delivery is enabled. Then re-test in PageSpeed Insights. Image improvements often account for 15 to 30 points of score gain on their own.
Common mistake: Optimising new uploads but leaving the existing media library untouched. Both Smush and ShortPixel have a bulk optimisation button. Use it on everything already uploaded.

Removing bloat: unused plugins and render-blocking scripts

Every active plugin on your WordPress site adds weight, even if you rarely use it. Some plugins load JavaScript or CSS files on every single page, even pages where they do nothing at all. A contact form plugin that loads its scripts on your homepage is wasted load time.

Audit your plugins

Go to Plugins in your WordPress dashboard and look critically at each one. Ask yourself whether it's genuinely active and necessary. Common culprits to consider removing:

  • Social sharing buttons from old providers
  • Page builder plugins for page builders you no longer use
  • Sliders and carousels (almost always slower than a static image)
  • Abandoned plugins with no recent updates
  • Duplicate functionality covered by another plugin

Render-blocking scripts

GTmetrix and PageSpeed Insights will flag any scripts that are blocking the page from rendering. This usually means a JavaScript file that loads in the page head and forces the browser to wait before displaying anything. WP Rocket's "Delay JavaScript Execution" feature handles this automatically. LiteSpeed Cache has an equivalent setting under the "Page Optimisation" tab.

You can also check which scripts your theme is loading unnecessarily. Tools like Query Monitor (a free plugin) show you exactly which scripts fire on each page.

Common mistake: Deactivating a plugin but not deleting it. Deactivated plugins still take up space and can still appear in security scans. Delete anything you're not using.

CDN: Cloudflare free tier

A content delivery network (CDN) stores copies of your static files (images, CSS, JavaScript) on servers around the world. When someone in Edinburgh visits your site, they get files from a nearby server rather than wherever your web host is based. This reduces latency significantly, particularly for overseas visitors.

Cloudflare offers a genuinely useful free tier that covers CDN, DNS management, and basic DDoS protection. Setting it up means changing your domain's nameservers to point to Cloudflare. Once done, Cloudflare sits between your visitors and your hosting server and caches your static content automatically.

  1. Create a free account at cloudflare.com
  2. Enter your domain. Cloudflare will scan your existing DNS records.
  3. Review the records it found and confirm they look correct
  4. Log into your domain registrar and update the nameservers to the two Cloudflare gives you
  5. Propagation takes anywhere from a few minutes to 24 hours. Once active, Cloudflare starts caching your content automatically.
Worth knowing: Cloudflare's free "Rocket Loader" feature, which defers JavaScript loading, can conflict with some WordPress themes. If you notice display issues after enabling it, turn Rocket Loader off first to see if that's the cause.
Common mistake: Enabling Cloudflare caching without setting up a page cache purge rule. When you update your site, Cloudflare may serve the old cached version to visitors for hours. Most caching plugins have a Cloudflare integration that clears the Cloudflare cache automatically when you publish changes.

Database optimisation

WordPress stores everything in a MySQL database: posts, pages, settings, plugin data, and a growing pile of revisions. Over time this database accumulates clutter. Post revisions alone can number in the thousands on an active site. Transients (temporary data stored by plugins) pile up. Old spam comments stay in the table.

A bloated database makes every database query slightly slower, which adds up across an entire page load.

Clean it up

WP-Optimize is a free plugin that handles most of this in one place. It can remove post revisions, clear out spam and trashed comments, remove expired transients, and run an OPTIMIZE TABLE query to defragment the database tables. LiteSpeed Cache also includes a database optimisation tab if you're already using it.

  1. Install WP-Optimize (or use LiteSpeed Cache's database tab if you have it)
  2. Take a database backup first using your host's backup tool or UpdraftPlus
  3. Select the clean-up options: revisions, trash, spam, transients
  4. Run the optimisation
Common mistake: Skipping the backup before database cleanup. WP-Optimize is reliable, but a backup takes two minutes and could save you hours if something goes wrong.

You can also limit how many revisions WordPress saves going forward by adding a single line to your wp-config.php file:

Add to wp-config.php (before the "That's all, stop editing" line): define('WP_POST_REVISIONS', 5); — this caps revisions at 5 per post rather than the unlimited default.

Core Web Vitals: common WordPress failures and fixes

Google's Core Web Vitals are a set of real-world performance metrics that affect your search rankings. There are three main ones, and WordPress sites fail them in predictable ways.

Largest Contentful Paint (LCP)

LCP measures how long it takes for the largest visible element on the page (usually the hero image or main heading) to appear. The target is under 2.5 seconds. WordPress sites fail this most commonly because:

  • The hero image is not preloaded. WP Rocket and LiteSpeed Cache both have a "preload critical images" or "LCP preload" setting. Enable it.
  • The image is too large. A full-width hero should typically be under 150KB for a JPEG. Use Smush or ShortPixel to compress it.
  • The server responds slowly. Go back to the hosting section if your TTFB is the bottleneck.

Cumulative Layout Shift (CLS)

CLS measures how much the page jumps around as it loads. A score above 0.1 means your page is visually unstable, which Google penalises. On WordPress sites the common causes are:

  • Images without dimensions — if your theme or page builder doesn't set a width and height on image elements, the browser doesn't know how much space to reserve, and the layout shifts when the image loads
  • Web fonts loading late — if your fonts take a moment to load, text reflows when they arrive. Use the font-display: swap CSS property, which most modern themes support
  • Ads and embeds — anything that loads asynchronously and pushes content down

Interaction to Next Paint (INP)

INP replaced First Input Delay (FID) in 2024 as a Core Web Vitals metric. It measures how quickly your page responds when someone interacts with it (clicks a button, taps a menu). The target is under 200ms. WordPress sites tend to fail this when too much JavaScript is running on the main thread. The fix is usually reducing or deferring third-party scripts, particularly chat widgets, tracking pixels, and marketing tools.

Action: Check your Core Web Vitals scores in Google PageSpeed Insights under the "Diagnose performance issues" section. Each failing metric comes with specific suggestions. Work through them in order of estimated impact.
Common mistake: Optimising for the lab score (the score PageSpeed shows for a fresh simulated test) without checking field data. The "Field Data" section at the top of PageSpeed Insights shows what real visitors experienced over the past 28 days. That is what Google actually uses for rankings.