Your WordPress site is slow. You have 20-something plugins installed and you’re pretty sure one of them is the problem. But which one?
This is probably the most common question I get from site owners. And honestly, the answer isn’t always straightforward – because it’s rarely just one plugin. It’s usually a combination of poorly written callbacks, excessive database queries, and plugins loading assets on every single page whether they need to or not.
Let me walk you through how to actually find which plugin is slowing down your WordPress site, from the basic manual approach to the proper diagnostic tools that show you exactly what’s happening under the hood.
The Manual Method: Disable One by One
This is what every WordPress tutorial tells you to do. And it works – sort of.
The process is simple:
- Deactivate all plugins.
- Check your page load time (use your browser’s DevTools network tab or PageSpeed Insights).
- Reactivate plugins one at a time.
- After each activation, check the load time again.
- When the load time jumps, you found your culprit.
Simple, right? Here’s why this method is problematic in practice.
Why the Manual Method Falls Short
It takes forever. If you have 25 plugins, you’re looking at 25+ rounds of deactivate-measure-reactivate. Each measurement should be done 3 times minimum to account for variance. That’s 75 page loads just to find one slow plugin.
It misses interactions. Plugin A might be fine on its own. Plugin B might be fine on its own. But together they trigger something – maybe a shared hook that fires twice, or a conflict that causes redundant database queries. Disable-and-test won’t catch this because you’re testing plugins in isolation.
It doesn’t tell you why. Ok, you found that WooCommerce slows your site by 400ms. Great. Now what? WooCommerce has hundreds of hooks and callbacks. Which specific one is the bottleneck? The manual method can’t tell you that.
Your site is down during testing. If this is a production site, deactivating plugins means breaking functionality for real visitors. Not ideal.
The manual method is fine as a last resort. But there are much better approaches. Let me show you.
Method 2: Query Monitor – Free and Solid
Query Monitor is the go-to debugging plugin for WordPress developers. It’s free, it’s well-maintained by John Blackbourn, and it gives you a detailed breakdown of what happens during every page load.
Install it, activate it, and you’ll see a new toolbar at the top of your admin bar showing page generation time, memory usage, and query count.
What Query Monitor Shows You
The panels you care about for finding slow plugins:
- Queries by Component – shows which plugin or theme is responsible for each database query, grouped and sorted. This is huge. If a plugin is running 50 queries per page load, you’ll see it immediately.
- Hooks in Use – lists every hook that fired on the current page, with priority, callback function, and the component (plugin/theme) responsible. You can filter by component to see everything a specific plugin is doing.
- HTTP API Calls – shows external HTTP requests. This is often where hidden slowness lives. A plugin checking for updates, hitting an external API, or loading remote data on every page load.
- Scripts and Styles – shows every CSS and JS file enqueued, by which plugin. If a contact form plugin is loading its assets on your homepage, you’ll see it here.
The Limitation of Query Monitor
Query Monitor is excellent at showing you what happened during a page load. It shows queries, hooks, assets, and HTTP calls grouped by plugin.
But it doesn’t directly time individual hooks and callbacks. You can see that a plugin registered 15 callbacks across various hooks – but you can’t see that one specific callback on wp_head at priority 10 took 200ms while the others took 1ms each.
Query Monitor does have a profiling API where you can manually wrap code sections with do_action( 'qm/start', 'my-timer' ) and do_action( 'qm/stop', 'my-timer' ). But that requires editing code – you need to know where to look first.
For database-heavy plugins, Query Monitor is perfect. For hook-level timing, you need something else.
Method 3: Hook Profiling – Finding the Exact Callback
This is where things get precise. Instead of disabling entire plugins, a hook profiler measures the execution time of every single callback that fires during a page load.
Think of it this way: WordPress processes a request by firing a sequence of hooks – init, wp, template_redirect, wp_head, the_content, wp_footer, etc. Each hook can have dozens of callbacks attached by your theme and plugins. A hook profiler wraps each callback with a timer and reports the results.
This means you don’t just find the slow plugin – you find the slow function. That’s a completely different level of diagnostic information.
What a Hook Profiler Reveals
A proper hook profiler will show you something like:
- Callback
SomePlugin::generate_critical_css()on hookwp_headat priority 10 – took 340ms - Callback
AnotherPlugin::check_license()on hookinitat priority 5 – took 180ms (external HTTP call) - Callback
ContactFormPlugin::enqueue_assets()on hookwp_enqueue_scriptsat priority 10 – took 45ms
Now you’re looking at actionable data. You can see that the CSS generation callback is the biggest bottleneck. You can see that a license check is making an external HTTP request on every page load. You can trace each slow callback to its exact source file and line number.
This is what WP Multitool’s Find Slow Callbacks module does. You profile any page on your site, and it returns a ranked list of every callback by execution time, showing which plugin or theme each belongs to. No guessing, no disabling plugins one by one.
Hook Profiling vs. Query Monitor: When to Use Which
They’re complementary tools, not competitors.
Use Query Monitor when:
- You suspect database queries are the bottleneck (it groups queries by plugin and shows slow ones)
- You need to debug a specific page template or conditional logic
- You want to see which scripts and styles are loading unnecessarily
- You’re debugging REST API requests or AJAX calls
Use a hook profiler when:
- Page load time is high but query count looks normal
- You need to find the exact callback function that’s slow, not just the plugin
- You suspect PHP execution time is the problem, not database
- A plugin has many hooks and you need to know which specific one is the bottleneck
In my experience, the most effective approach is to start with a hook profile to find the slow callbacks, then use Query Monitor to dig into the database queries those callbacks are generating. Top-down, then bottom-up.
Common Culprits: What Usually Causes Plugin Slowness
After profiling hundreds of WordPress sites, certain patterns keep showing up. Here’s what to look for.
1. External HTTP Requests on Every Page Load
This is the number one performance killer that most people miss. A plugin makes an HTTP request to an external server – to check a license, fetch social counts, load remote data, or verify an API key. Each request adds 200-2000ms depending on the remote server’s response time.
The worst part? These often happen on init or admin_init, meaning they fire on every single page load. Check Query Monitor’s HTTP API Calls panel – if you see external requests that aren’t cached, that’s your problem.
2. Plugins Loading Assets Everywhere
A contact form plugin that loads its CSS and JavaScript on every page, not just the page with the form. A slider plugin loading its library on posts that don’t have sliders. This is incredibly common and adds up fast.
Query Monitor’s Scripts and Styles panel makes this obvious. Look for plugin assets loading on pages where they shouldn’t be. The fix is usually a conditional dequeue or switching to a plugin that handles this properly.
3. Unoptimized Database Queries
Some plugins run queries without proper indexing, or they query the entire wp_options table with autoloaded data they don’t need on every page. I wrote about this specifically in the slow queries guide – it’s a deep topic.
The autoload problem deserves special mention. Plugins that store large serialized arrays in wp_options with autoload=yes are silently adding to every single page load. WP Multitool’s Autoloader Optimizer module specifically addresses this.
4. Redundant Processing in wp_head
The wp_head hook is where a lot of damage happens. Plugins generating inline CSS, computing critical styles, outputting meta tags that require database lookups – all of this runs before any visible content reaches the browser.
Profile your homepage and sort by the wp_head hook. You might be surprised how much time is spent there.
5. Plugin Conflicts Creating Duplicate Work
Two SEO plugins both generating meta tags. Two caching plugins fighting each other. An optimization plugin and a CDN plugin both trying to rewrite URLs. These conflicts don’t just cause errors – they cause slowness through redundant processing.
A Practical Diagnostic Workflow
Here’s the process I actually follow when someone tells me their WordPress site is slow and they want to find the plugin causing it.
Step 1: Establish a Baseline
Before touching anything, measure your current state. Open your browser’s DevTools, go to the Network tab, and do a hard refresh (Ctrl+Shift+R). Note the total page load time and the TTFB (Time to First Byte). TTFB is the important one – it tells you how long the server took to generate the page.
If TTFB is under 200ms, your server-side performance is fine and the problem is likely frontend (too many scripts, unoptimized images). If TTFB is over 500ms, you have a backend problem – and that’s where plugins live.
I outlined a more complete version of this in the diagnostic framework article.
Step 2: Profile the Page
Run a hook profile on the slow page. If you’re using WP Multitool, go to the Find Slow Callbacks module, enter the URL, and hit profile. You’ll get a ranked list of callbacks by execution time.
Look at the top 5 callbacks. They typically account for 80% of the total execution time. Note which plugins they belong to.
Step 3: Investigate the Slow Callbacks
Now you know which callbacks are slow. The question is why.
Open Query Monitor and navigate to the page. Check the Queries by Component tab for the plugins you identified. Are they running expensive queries? Are they making external HTTP calls? Are they doing heavy PHP computation?
This combination – hook profiler to find the slow callbacks, Query Monitor to understand why they’re slow – gives you the complete picture.
Step 4: Fix or Replace
Once you know the exact callback and the reason it’s slow, you have options:
- Disable the feature – if the plugin has a setting to turn off the slow functionality, use it.
- Dequeue unnecessary assets – if the plugin loads scripts/styles everywhere, conditionally remove them.
- Add caching – if a callback runs expensive queries, a transient cache might help.
- Replace the plugin – sometimes the plugin is just poorly written. Find an alternative.
- Report to the developer – with specific callback and timing data, the developer can actually fix it.
What About P3 (Plugin Performance Profiler)?
You might see older articles recommending P3 Plugin Performance Profiler. Don’t use it. It hasn’t been updated since 2017, it’s not compatible with modern PHP versions, and it can actually crash your site. The WordPress plugin directory still lists it but it’s effectively abandoned.
Code Profiler is a more modern alternative if you want a free standalone profiling plugin. It generates detailed charts showing execution time per file and function. The reports are comprehensive – maybe too comprehensive for a quick diagnosis, but great for deep dives.
The “Is It Really a Plugin?” Check
Before you spend hours hunting for a slow plugin, make sure the problem is actually a plugin. Sometimes slow WordPress sites are caused by:
- Slow hosting – if your TTFB is 2+ seconds with zero plugins, it’s not a plugin problem. It’s your server.
- Theme issues – themes can be just as slow as plugins. The same diagnostic process applies.
- Database bloat – millions of post revisions, spam comments, expired transients. Check the database bloat guide.
- No page caching – without caching, WordPress regenerates every page from scratch. That’s slow by design.
- wp-config.php misconfiguration – wrong memory limits, debug mode left on in production. See the wp-config tuning guide.
If your admin dashboard is specifically slow, that’s a different diagnostic path – admin-only plugins and dashboard widgets are often the cause there.
Bottom Line
Finding which plugin is slowing down your WordPress site doesn’t have to be a guessing game. The disable-one-by-one method works but it’s slow, disruptive, and doesn’t give you the full picture.
Better approach: profile first, investigate second, fix third. A hook profiler tells you which callbacks are slow. Query Monitor tells you why. Together they give you precise, actionable information instead of trial and error.
The number of plugins you have installed matters way less than the quality of those plugins. I’ve seen sites with 40 plugins loading in under a second, and sites with 8 plugins taking 4 seconds. It’s not about quantity – it’s about what each plugin actually does on every request.
Profile your site. Look at the data. Fix what’s actually slow.
Join developers and agency owners who get backend optimization strategies, tool releases, and deep-dive guides.
No spam. Unsubscribe anytime. We respect your privacy.
