Find out which plugin is slowing your site, by measuring it rather than guessing. The doctor times your own pages with each plugin briefly left out of its own internal test requests, then explains what each one costs in plain English.

Requirements

WordPress 6.2+, PHP 8.0+. The server must be able to request its own pages (the same loopback ability WP-Cron needs). Everything runs on your own server; no account, no cloud, no telemetry.

Running a diagnosis

Tools > Speed Doctor opens the plugin. The Doctor tab runs a preflight first: it checks that loopback requests work, that a page cache is not flattening the results, and that no background job is adding noise. Fix anything it flags, then press the button. A scan sends a few hundred internal requests over several minutes and reports progress as it goes. Leave the tab open.

The measurement loader

Timing a plugin's absence means loading the site without it. A small helper file is placed in wp-content/mu-plugins, and it takes effect only for the doctor's own internal requests, which carry a cryptographic signature bound to the exact path and method being measured. Normal visitors and logged-in users always get the site exactly as configured. The file is installed only when you press the button on the Doctor tab, its status is shown there, and it is deleted automatically when you deactivate the plugin.

Reading the results

Verdicts are sorted worst first, each with a Low, Medium or High impact badge and a measured range such as "adds about 180 to 260ms to page loads". Ranges are medians with confidence bands taken from repeated interleaved timings, so they reflect real variation rather than invented precision. When the server is too noisy for a trustworthy answer the doctor says "inconclusive" instead of inventing a number. Front-end and wp-admin are measured separately, because plugins that are cheap for visitors are often expensive in the dashboard.

Dependency groups

Some plugins cannot be loaded without another one and will fatal if separated, such as a WooCommerce extension without WooCommerce. The doctor detects these relationships and measures the group as a whole, labelling the result so you know the cost is shared.

Assets and database

The Assets tab lists every script and stylesheet your pages load, attributed to the plugin that ships it, with sizes and render-blocking flags. A plugin whose PHP is fast can still send hundreds of kilobytes of JavaScript to every visitor. The Database tab reports autoloaded-option weight with probable owners, a common and largely invisible cause of slow requests.

Before and after

Recent scans are kept automatically as a rolling history, so you can scan before a round of plugin updates and again afterwards and see exactly what changed. The number of scans retained is filterable with dragonspeeddoctor_retain_scans.

Host-safe mode

A scan adds load while it runs. On a busy or resource-limited host, enable host-safe mode in Settings to space the requests out further. It takes longer and is gentler.

Behind a proxy or in a container

If the server cannot reach its own public URL, define DRAGONSPEEDDOCTOR_LOOPBACK_BASE in wp-config.php with an address it can reach, such as an internal hostname or private IP. The correct Host header is preserved so WordPress still routes normally. For safety the override is honoured only when it points at a loopback or private address; a public host is ignored, so measurement traffic never leaves your infrastructure.

WP-CLI

wp speed-doctor scan runs a full diagnosis from the command line and prints the verdicts, which makes it easy to script or schedule.

Uninstall

Deactivating removes the measurement loader. Your scan history is kept on uninstall unless you opt in first, by ticking the delete-on-uninstall box in Settings.