Description
Every slow WordPress site raises the same question: which plugin is doing this? Dragon Speed Doctor answers it with measurements, not guesswork.
Install the measurement loader, press Run diagnosis, and the doctor times your site over a few minutes of internal test requests, with each plugin briefly left out of those test requests only, then tells you what each plugin actually costs:
- Per-plugin timing, front-end and wp-admin: “Adds about 180–260ms to page loads.” Real measured ranges, never invented precision. When results are too noisy to trust, it says so instead of making a number up.
- Asset audit: every script and stylesheet on your pages, attributed to the plugin that ships it, with sizes and render-blocking flags. Sometimes a plugin’s PHP is fast but it sends 900KB of JavaScript to every visitor, and the doctor catches that too.
- Database signals: autoloaded-option weight (a common hidden slowdown) with probable owners.
- Plain-English verdicts with Low / Medium / High impact badges, sorted worst first.
- Before/after comparison: run a scan before updating plugins and another after, and see what changed. A rolling history of recent scans is kept automatically.
- Dependency awareness: plugins that can’t be separated (a WooCommerce payment gateway, say) are measured together and labelled honestly.
- WP-CLI:
wp speed-doctor scan.
Visitors are never affected: plugin loading is only altered for the doctor’s own internal, cryptographically signed test requests. Your live traffic always sees the site exactly as configured.
Features
- Per-Plugin Timing – What each plugin costs on the front end and in wp-admin, as honest measured ranges
- Asset Audit – Every script and stylesheet on your pages, attributed to the plugin that ships it, with render-blocking flags
- Database Signals – Autoloaded-option weight and probable owners, a common hidden slowdown
- Plain-English Verdicts – Low, Medium and High impact badges, sorted worst first, no jargon
- Before & After – Scan before updating plugins and again after, and see exactly what changed
- Dependency Awareness – Plugins that cannot be separated are measured together and labelled honestly
- Honest Confidence – Says “inconclusive” when the server is too noisy, instead of inventing a number
- WP-CLI –
wp speed-doctor scanfor scripted or scheduled diagnosis - No External Services – Everything runs on your own server; nothing is sent anywhere
Everything above is free, fully functional and unlimited.
How it measures
The method is built for noisy shared hosting: repeated interleaved timings, medians with confidence bands, warmup passes discarded, early stopping when a result is already clear, and honest “inconclusive” verdicts when server noise wins. A pre-scan check verifies your site can be measured (loopback requests allowed, no page cache serving the test requests, no background jobs adding noise) before anything runs.
The measurement loader
Timing a plugin’s absence requires briefly loading the site without it, for signed internal requests only. A small helper file in mu-plugins does this. It is installed only when you click Install loader on the Doctor screen (or run wp speed-doctor scan), shown there with its status, does nothing for any normal request, and is removed automatically when you deactivate the plugin.
External services
None. The doctor measures your site by requesting your own pages from your own server. Nothing is sent to Dragon Core or any third party. No telemetry, no accounts, no cloud.
Screenshots





Installation
- Upload the
dragon-speed-doctorfolder to/wp-content/plugins/, or install via the Plugins screen. - Activate the plugin.
- Go to Tools Speed Doctor, install the measurement loader, and run a diagnosis.
FAQ
-
Why is my WordPress site slow?
-
Usually one of four things: a plugin doing heavy work on every request, a plugin shipping large scripts to every page, bloated autoloaded options in the database, or slow hosting. The doctor measures the first three directly and tells you which plugin is responsible, so you fix the actual cause instead of guessing.
-
Is it safe to run on a live site?
-
Yes, with one caveat. Visitors are never served a modified site. Plugin loading changes only for the doctor’s own signed internal requests. The caveat: a scan sends a few hundred requests to your server over several minutes, which adds load. On a busy site, run it at a quiet time, or enable host-safe mode in Settings to slow it down further.
-
How is this different from Query Monitor?
-
Query Monitor is a superb developer tool that inspects the current request in deep technical detail. The doctor answers a different question, namely which plugin to blame, by measuring whole pages with and without each plugin, and it answers in sentences rather than stack traces. Many people will want both.
-
Is this a profiler?
-
Not in the function-call sense. It does not hook into PHP or list which functions ran. It measures whole page loads with and without each plugin, so the result is a per-plugin cost in milliseconds rather than a call tree. The asset and database audits are separate, single-pass checks.
-
Why does a plugin say “measured together with plugins that depend on it”?
-
Some plugins fatal when a plugin they depend on is missing, such as a WooCommerce extension without WooCommerce. The doctor detects this and measures the group as a whole rather than breaking your test requests.
-
Does it work behind a reverse proxy or in a container?
-
Usually yes, automatically. If your server cannot reach its own public URL, define
DRAGONSPEEDDOCTOR_LOOPBACK_BASEinwp-config.phpwith an address the server can reach (for examplehttp://app-containeror a private IP). Only the scheme, host and port are used; any path on the address is ignored because each request keeps its own path. The doctor keeps the correct Host header so WordPress routes normally. For safety the override is honoured only when the host islocalhost, a loopback, private or link-local IP address written in full (dotted IPv4 or bracketed IPv6), or a hostname whose every DNS address is in one of those ranges. Anything else, including a name that does not resolve, is ignored, so measurement traffic never leaves your infrastructure.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Dragon Speed Doctor – Find What Slows Your Site Down” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Dragon Speed Doctor – Find What Slows Your Site Down” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.1.1
- Fixed: a diagnosis that did not measure wp-admin (for example when wp-admin kept failing to load) logged PHP warnings while working out the results. An unmeasured page is now simply treated as inconclusive.
- Fixed: the measurement loader could fatal if another plugin asked it for measurement details on an ordinary request. It now answers “not a measurement request”.
- Changed: the results summary no longer shows a “0 low impact” badge.
1.1.0
- Fixed: a homepage that redirects to another page on the same site (for example / to /en/, or to a landing page) made the preflight check fail with a message about firewalls. The doctor now follows up to three redirects within the site and measures the page they lead to. A redirect to a different site, or to a page that errors, is reported with its own message.
- Added: each diagnosis records the plugin, theme and WordPress versions it measured, and the site’s overall response time per page, so later diagnoses can be compared against them.
- Developers: new
dragonspeeddoctor_tool_pluginsfilter anddragonspeeddoctor_verdict_detailsaction (under each verdict on Results);dragonspeeddoctor_page_setreceives the scan source as a second argument;dragonspeeddoctor_scan_completereceives the scan’s environment as a third argument; newdragonspeeddoctor_signed_requestaction on verified measurement requests.
1.0.7
- Changed: the Doctor tab is now one guided card with two numbered steps. Step 1 installs the measurement loader; step 2, Run diagnosis, unlocks once the loader is in place. Installing or removing the loader no longer reloads the page.
- Added: a summary of the latest diagnosis on the Doctor tab (impact counts and the plugins that need attention), and the same counts plus a Run again button at the top of Results.
- Changed: on Results, plugins with low impact are grouped in a collapsible section so the ones worth acting on come first.
- Fixed: a plugin rated High because of the scripts and styles it ships, but with only a small timing cost, showed no reason for the rating. The verdict now also states the asset weight whenever it is heavy enough to affect the rating.
- Added: the Database tab marks the autoload total as Healthy or Above 800KB.
- Added: live progress now shows the elapsed time, and the browser warns before you leave the page while a diagnosis is running.
- Changed: preflight checks read OK, Warning or Blocked (translatable), and the Results, Assets and Database tabs link straight to the Doctor tab when there is no diagnosis yet.
- Fixed: a loader install or removal that failed was not reported; the reason is now shown.
- Fixed: if a request failed during a diagnosis, the Run diagnosis button stayed disabled until the page was reloaded, and a failed start left the screen on “Checking…”. A diagnosis interrupted by a dropped request now picks up where it left off when you click Run diagnosis again, instead of being refused as already running.
- Fixed: the Dragon Core mark was missing from the page title.
1.0.6
- Added: an occasional, dismissible request for a WordPress.org review once the doctor has produced results, shown only on its own screen.
- Changed: listing title and tags for the WordPress.org directory.
1.0.5
- Fixed: two active plugins whose Requires Plugins headers point at each other (or a longer loop of them) made the dependency grouping recurse until PHP ran out of memory before a diagnosis could start. Chains are now walked without recursion, and every plugin in such a loop is measured as one group.
- Changed: readme wording tidied.
1.0.4
- Fixed: asset sizes were reported as 0 for scripts and styles with a scheme-relative (//), http:// or document-relative address, for percent-encoded file names, on subdirectory installs, and when wp-content lives outside the WordPress folder. Every address is now resolved against the page it was found on, then located with the site path stripped and wp-content resolved to its real directory. Only files inside the WordPress and wp-content folders are ever read.
- Fixed: the asset table could attribute a plugin’s scripts to “core/other” when the address differed from the site’s wp-content URL in scheme, letter case or a www. prefix, or used ../ segments. Attribution now matches on the resolved host and path.
- Fixed: DRAGONSPEEDDOCTOR_LOOPBACK_BASE with a path (for example http://app-container/wp) doubled that path on subdirectory installs and timed 404 pages. The base is now used as an origin only; each request keeps its own path.
- Security: the loopback base is validated more strictly. IP literals must be a full dotted IPv4 or bracketed IPv6 address in a loopback, private or link-local range (integer, shorthand and public IPv6 forms are refused), and a hostname is accepted only when every address it resolves to is in such a range. Unresolvable names are refused.
- Fixed: activation recorded the install as complete even when the scans table or the signing secret had not been stored. Both are now verified first; an incomplete install is retried on the next admin load and shown as an admin notice until it succeeds. Existing sites are checked once on upgrade.
- Fixed: a diagnosis that could not be started, saved or finished in the database is now reported as an error instead of appearing to start or finish without results.
1.0.3
- Wording tidied across the readme and the plugin screens for clarity. No functional changes.
1.0.2
- Readme: changelog and upgrade notice now cover 1.0.1, which shipped without entries.
- Code comments reworded to describe the filter hooks they document.
1.0.1
- Safety: during a measurement request the active-plugins list can no longer be written back to the database, so a probe can never deactivate your other plugins.
- Reliability: an abandoned scan is reclaimed after 15 minutes so it cannot block future scans; the measurement loader is refreshed before each run.
1.0.0
- Initial release: per-plugin timing attribution (front-end and wp-admin), asset audit, database signals, plain-English verdicts, before/after comparison, WP-CLI.
