// blog / speed

How I find out why a WordPress site is so slow before fixing anything

Why is my WordPress site so slow? Usually one layer is to blame: the server's response, the weight of the front end, or the admin and its database. I find which one before touching anything, because each layer has its own fix, and that's why another cache plugin so often changes nothing.

By Muhammad Younus Updated 10 min read Speed

Speed and Core Web Vitals: illustration for "Finding why a WordPress site is slow"
// 01 - the usual causes

What are the most common reasons a WordPress site is so slow?

These are the causes I find most often. Each one comes with the check that confirms it, because working out which one is eating the time comes before any fix I'd suggest.

  1. i.

    No page cache, or one that's skipped

    I time the HTML logged out, through the cache and with it bypassed. If both are equally slow, nothing's serving that page from cache. The fix is one working page cache, not another cache plugin on top.

  2. ii.

    Hosting that can't keep up

    A clean install with a default theme on the same plan is the test. If that's slow to respond too, the hosting's the limit, and no plugin tuning will get past it.

  3. iii.

    An old PHP version

    WordPress recommends a host that supports PHP 8.3 or greater. Site Health warns when a site runs an outdated version and notes that newer ones are built with performance in mind. I test the upgrade on a staging copy first, since old plugins can break.

  4. iv.

    Heavy plugins, not just many

    Query Monitor groups slow database queries and outside HTTP requests by the plugin that ran them. What a plugin runs matters more than the plugin count, so I remove or replace the one it names.

  5. v.

    A theme or page builder loading everything everywhere

    Builders and themes that load their CSS and scripts on every page, used or not, hold back the first paint. I unload what a page doesn't use and defer what the first screen doesn't need. My guide to SEO in Elementor covers the builder speed settings I change; my Elementor SEO fixes cover the rest.

  6. vi.

    A main image that starts late

    A hero set as a CSS background, lazy loaded, or inserted by a slider script is found late by the browser, so it downloads late. It's usually a bigger delay than the download itself.

  7. vii.

    Images far bigger than their slot

    A camera-sized photo shown in a phone-sized space still downloads in full. Right-sized images from srcset, compression and a modern format like WebP or AVIF fix it.

  8. viii.

    Third-party scripts and embeds

    Chat widgets, tag managers, video embeds and ad scripts share the main thread with your page, and they're often why the first tap feels stuck. I keep the ones earning their cost and load the rest later.

  9. ix.

    No CDN, or a CDN that can't cache

    web.dev recommends a CDN for getting files geographically close to visitors. It also notes that unique URL parameters, like analytics tags, can stop a CDN serving from cache, so I check it's actually caching, not just switched on.

  10. x.

    A bloated database

    Since WordPress 6.6, Site Health flags autoloaded options over 800 KB. Rows left behind by old plugins get read on every request, admin screens included, which is why the dashboard often shows it first.

Which of these matters also depends on the metric that's failing. A late hero image is an LCP problem, a jumping layout is CLS and a tap that doesn't respond is INP, and each gets its own diagnosis rather than a general tidy-up.

// 02 - the three layers

Why is my WordPress site so slow: the server, the front end or the admin?

Every cause above lives in one of three layers, and I find the layer first. A page can sit on a blank tab before the server sends a single byte. It can arrive quickly and then keep pulling in scripts and images for seconds. Or it can load fine for visitors while the dashboard crawls for whoever's editing. This is my first-look shortcut.

The symptom usually points at the layer
The symptomWhich layerFirst thing I open
Every page waits before anything shows, even a plain oneServer responseQuery Monitor on an uncached page, and the HTML document's timing in the DevTools Network tab
The page starts quickly, then images and scripts keep arrivingFront endThe DevTools waterfall with a throttled phone profile
Visitors are fine, but saving a post or opening the dashboard dragsAdmin and databaseQuery Monitor inside wp-admin, autoloaded options and admin-ajax requests
Only some pages are slow, like the cart, search or account pagesPages the cache can't serveWhether those URLs skip the page cache, then Query Monitor on them

Search Console sits over all three. Its Core Web Vitals report grades real visits, so it tells me whether visitors actually feel the problem, and on which group of URLs, before I spend an hour on a page nobody's slow on.

// 03 - the method

How I diagnose a slow WordPress site, in order

The order matters more than the tools. Each step either rules a layer out or points harder at it.

  1. Step 01

    Start with what real visitors get

    The Core Web Vitals report in Search Console and the field data in PageSpeed Insights both come from the Chrome User Experience Report, which records real visits over a trailing 28 days. If that looks healthy and the complaint is the dashboard, I go straight to the admin. Without enough traffic for field data, I lean on lab tests and say so.

  2. Step 02

    Time the HTML on its own

    I time the HTML document, not the whole page, once with the page cache bypassed and once through it. If the uncached number is slow, the problem's on the server, and nothing in the browser will rescue it.

  3. Step 03

    Ask WordPress where the time went

    Query Monitor lists every database query, flags slow and duplicate ones, and groups them by the plugin or theme that ran them. It also times outside HTTP requests, so a plugin calling a remote server on every page load shows up here.

  4. Step 04

    Read the waterfall on a throttled phone

    In the DevTools Network panel, with the browser cache off and a mobile throttling profile on, I look at what the browser waits for before it paints: a stylesheet, a font file, a slider script, or the main image starting late.

  5. Step 05

    Find the LCP element and split its time

    The Largest Contentful Paint element is usually the hero image or the main heading. Its load time splits into four parts, and the biggest part tells me whether the fix is on the server, in how the image is found, in its file size or in what's blocking the paint.

  6. Step 06

    Check the admin on its own

    Logged in, I run Query Monitor on the slow admin screens and read Site Health for autoloaded options.

  7. Step 07

    Write it down before changing anything

    A short note: the layer, the evidence, the first change and the URLs I'll time again. Then one change at a time, so the next measurement says what actually worked.

// pro tip

Time your pages logged out, in a private window. A lot of cache setups skip logged-in users, so an owner checking their own site while signed in can be looking at the uncached version every time.

Rather have me do this? One person, whole job.

Book a call on Upwork
// 04 - server response

What does a slow server response look like?

It looks like nothing. The tab stays blank, and the waterfall shows one long bar for the HTML document before any stylesheet, font or image has started. Everything else waits for that first response, because the browser can't request files it hasn't been told about yet.

The time before that first byte is Time to First Byte. web.dev puts a good TTFB at 0.8 seconds or less and a poor one above 1.8 seconds. It isn't one of the Core Web Vitals, but it's the first of the four parts of Largest Contentful Paint, and web.dev's LCP guide says a high TTFB can make a 2.5 second LCP challenging, or even impossible. It names the usual reasons: redirects, visitors far from the server, poor networks, and cached content that can't be used because of query parameters.

On WordPress, a slow uncached response means PHP and the database are doing too much before they can answer. Query Monitor usually names the culprit: a query that runs far more often than it should, a plugin making an outside request on every page, or a theme building a huge menu from scratch on each load.

A page cache hides this from most visitors, but a cart, a search result or a logged-in page still pays the full cost every time.

// 05 - the admin

Why is the WordPress admin slow when the site isn't?

Because the page cache that makes the front end quick doesn't apply to wp-admin. Every dashboard screen is built fresh by PHP for a logged-in user, so whatever the cache hides from visitors lands on whoever's editing.

Autoloaded options are the first thing I check. WordPress loads every option marked autoload in one query on every request, so a few oversized rows left behind by old plugins get read constantly. Since WordPress 6.6, Site Health flags a critical issue when autoloaded options pass 800 KB, and a new or updated option over 150 KB isn't autoloaded unless the code saving it asks for that.

The Heartbeat API is the second. It's WordPress's built-in polling, and it calls admin-ajax on an interval of 15 to 120 seconds. Several editor tabs open at once, on hosting with few PHP workers, and those calls start queueing behind each other and behind any visitor request the cache can't serve.

The third is plugins doing work on admin page loads: license checks, update checks and dashboard widgets that fetch news from elsewhere. Query Monitor's HTTP requests panel lists each one with the time it took.

// when to hand this over

If you'd rather one person worked out which layer is slow and then fixed it, that's the speed work I do, remotely, with timings on the same URLs before and after. You can see how a job runs on the process page.

Book a call on Upwork
// 06 - the usual advice

Why doesn't installing another cache plugin fix it?

Because a page cache fixes one thing: it stops PHP rebuilding the same page for every anonymous visitor. If the time's going into a late hero image, a render-blocking stylesheet or a chat widget, the cached HTML just arrives sooner and the page still waits on the same files.

Stacking them can make things worse. Two plugins minifying the same files, or two page caches on top of a host's own server cache, can clash, and then the fix is taking one away. So I check what caching already exists, including the host's, before I add anything.

The same goes for other checklist fixes. An image plugin helps when images are the problem, a CDN helps when distance is, and neither touches a slow database query. I work alone and remotely, so the person who measures it is the person who fixes it, and there's more on that on the about page.

Is this your site? Send me the URL.

Book a call on Upwork
// questions - speed

What else do people ask about this?

Why is my WordPress site so slow today?

Something changed, so I start with the date it slowed down. A plugin, theme or core update, a new script or widget, a problem at the host, or a spike in traffic or bots are the usual causes, and Query Monitor plus a waterfall shows which layer moved.

How can I speed up my WordPress site?

Fix the layer that's slow, in order of the evidence: a working page cache for logged-out visitors, hosting and a PHP version that keep up, right-sized images in a modern format, fewer scripts in the head, and a CDN for distant visitors. Then time the same URLs again.

Is my hosting the reason my WordPress site is slow?

Sometimes, and it's testable. If a clean install with a default theme on the same plan is also slow to respond, the hosting's the limit. If that install is quick and your site isn't, the weight's in your theme or plugins.

Does a low PageSpeed score mean my site is slow for visitors?

Not necessarily. The mobile score comes from one Lighthouse lab run on a simulated mid-tier phone. The field data shown with it, from real Chrome visits over 28 days, is what visitors actually get, and it's what Search Console grades.

Can a plugin tell me why my WordPress site is slow?

Query Monitor gets closest. It shows slow and duplicate database queries, groups them by the plugin or theme responsible and times outside HTTP requests. It can't see the browser side, so I pair it with a DevTools waterfall.

// sources - checked

Where do these rules come from?

Platform and Google documentation, opened and read on the day this was written. Everything else is how I work.

  1. web.dev: optimize Largest Contentful Paint
  2. web.dev: Time to First Byte (TTFB)
  3. WordPress.org: requirements
  4. WordPress.org documentation: Site Health screen
  5. Search Console Help: Core Web Vitals report
  6. PageSpeed Insights: about lab and field data
  7. WordPress.org plugin directory: Query Monitor
  8. WordPress Plugin Handbook: Heartbeat API
  9. Make WordPress Core: disabling autoload for large options
Muhammad Younus, WordPress technical SEO consultant
// who wrote this

One consultant, writing down his own method

I'm Muhammad Younus, a WordPress technical SEO consultant with 8+ years of experience and 100+ client sites fixed. Top Rated Plus on Upwork with a 100% Job Success Score. Every post here is the way I actually do the job, written in the first person because it's one person doing it, remotely, with no team behind the name.

Nothing in these posts is a client I can't name or a number I can't show. Where a figure comes from a client's Search Console, it's from a published case study, and where a rule comes from Google or a platform, the source is linked at the bottom of the post.

// the service behind this post
Muhammad Younus, WordPress technical SEO consultant, smiling warmly at the camera
// next step

Want this done on your own site?

Book a call on Upwork, send the URL and read-only Search Console access, and you'll get a written scope for the search side before any work starts. One person does the whole job, remotely.

Book a call on Upwork