Why the admin is slow when the site is fast
Page caching serves the front end without running WordPress at all. The admin has no such luxury: every screen runs the full stack, every plugin's admin hooks, and every query, for a logged-in user. A site whose front end loads in 300 milliseconds can have an admin that takes eight seconds per page, and the owner concludes WordPress is slow when the actual causes are five specific things. Here they are, with the measurement and the fix for each.
Measure first
Install Query Monitor on staging or, briefly, on live. Load the dashboard, the posts list and an edit screen. Read three numbers: total page generation time, number of database queries, and the slowest queries. Then the Hooks & Actions panel for what ran longest. This turns "the admin is slow" into "this plugin runs a 1.2-second query on every admin page".
Cause 1: autoloaded options
WordPress loads every option marked autoload = yes on every request, front and back, in one query, and stores the result in memory. That is fine when the total is a few hundred kilobytes. Plugins that store large blobs as autoloaded options, caches, logs, serialised settings, product feeds, push it into megabytes, and every request pays to fetch, unserialise and hold that data.
Measure:
SELECT SUM(LENGTH(option_value)) / 1024 / 1024 AS autoload_mb
FROM wp_options WHERE autoload IN ('yes', 'on');
SELECT option_name, LENGTH(option_value) / 1024 AS kb
FROM wp_options WHERE autoload IN ('yes', 'on')
ORDER BY LENGTH(option_value) DESC LIMIT 20;WP-CLI does the same: wp option list --autoload=on --fields=option_name,size_bytes --format=table sorted by size.
Over about one megabyte is worth acting on. We have seen twenty.
Fix: for each large option, find the plugin that owns it. If the plugin is gone, delete the option. If it is a cache or log, the plugin usually has a setting to disable or limit it. If the option is needed but not on every page, set its autoload to no; the plugin will load it on demand. Recent WordPress versions add wp_autoload_values_to_autoload filtering and cap autoloaded options automatically above a size, which helps but does not remove the underlying bloat.
Cause 2: expired transients
Transients are temporary cached values with an expiry. Without a persistent object cache they live in wp_options, and expired ones are only cleaned up lazily. Sites accumulate tens of thousands, many autoloaded, many from plugins long removed.
Measure: SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '\_transient\_%';
Fix: wp transient delete --expired and, if the count is absurd, wp transient delete --all (they regenerate). Then a persistent object cache, Redis or Memcached, so transients never touch the database again. Most managed hosts offer this in a click, and it is the single largest admin speed improvement available.
Cause 3: WP-Cron running on page load
WordPress's scheduler runs whenever someone loads a page and a task is due. In the admin, that someone is you, and the task might be a plugin's hourly import, a sitemap regeneration, a backup. Your page waits.
Measure: Query Monitor shows cron runs. WP Crontrol lists scheduled events and their intervals; look for anything frequent and heavy.
Fix: disable the page-load trigger with define('DISABLE_WP_CRON', true); in wp-config.php and have the server call wp cron event run --due-now every minute via a real cron job. The tasks run in the background, never in your request. This is standard on any properly configured host.
Cause 4: dashboard widgets and admin notices
The dashboard calls home. WordPress news feeds, plugin "what's new" panels, licence checks, update checks, analytics summaries pulled live from external APIs. Each is a network request in your page load, and a slow one blocks the screen.
Measure: Query Monitor's HTTP API Calls panel on the dashboard.
Fix: remove dashboard widgets you do not use (Screen Options, or remove_meta_box in a small plugin). Set the site's update checks to run via cron rather than on admin load. For plugins that phone home on every screen, check for a setting or, if they are that badly behaved, reconsider the plugin.
Cause 5: heavy admin queries from plugins
Plugins that add columns to the posts list (SEO scores, view counts, thumbnails) often run one query per row, or one enormous query per page. Order and customer lists in WooCommerce without HPOS enabled. Plugins that count things on every admin page for a badge.
Measure: Query Monitor's Queries by Component, on the slow screen.
Fix: depends on the plugin. Disable the column. Enable HPOS for WooCommerce. Add the missing index if a query is scanning a large meta table. Or replace the plugin with one that does its counting on a schedule.
The general prescription
- Persistent object cache. Removes most option and transient cost.
- Server cron instead of page-load cron.
- Autoloaded options under a megabyte; transients cleaned.
- Dashboard stripped to what is used.
- Query Monitor once a quarter to catch the next plugin that misbehaves.
An admin that took eight seconds typically comes down to under one with the first two alone. The rest keeps it there.
Where this fits
Admin speed is not a vanity metric. A slow admin means the client edits less, updates less and trusts the site less. It is one of the checks in a WordPress health review and one of the things kept in order on a care plan, and when a site arrives with an eight-second dashboard, the autoload query above is the first thing we run in WordPress work.