WordPress · Debugging Workflow
How to Diagnose a WordPress Plugin Conflict
A systematic workflow for finding which plugin is causing the problem. Not guessing. Follow the steps in order and you'll have the answer in 10 minutes.
When to use this: When your site breaks and you suspect a plugin, but you don't know which one. The plugin conflict fix page covers the emergency deactivation. This guide is the deeper diagnostic when you want to know why.
Enable WP_DEBUG
By default, WordPress hides PHP errors. Turn on debug logging so you can see what's happening.
Edit wp-config.php in your WordPress root. Find this line:
define('WP_DEBUG', false);
Replace it with these four lines:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', true);
What each does:
WP_DEBUG— turns on error reportingWP_DEBUG_LOG— writes errors towp-content/debug.logWP_DEBUG_DISPLAY— hides errors from visitors (important for production)SCRIPT_DEBUG— loads unminified CSS/JS so conflicts are easier to trace
Turn this off when done. Leaving WP_DEBUG on in production fills the log with notices and can expose file paths to visitors.
Reproduce the error
Visit the exact page or trigger the exact action that breaks the site. Then check the log file.
Where to find the log:
- Via SFTP:
wp-content/debug.log - Via your host's file manager: same path
- Via WP-CLI:
wp log show --lines=50(if the WP-CLI log command is available)
Open the last ~50 lines. You're looking for:
[16-Oct-2026 14:22:01 UTC] PHP Fatal error: Uncaught TypeError:
Cannot access offset of type string on string in
/home/user/public_html/wp-content/plugins/some-plugin/includes/class-handler.php:142
[16-Oct-2026 14:22:01 UTC] PHP Stack trace:
[16-Oct-2026 14:22:01 UTC] PHP 1. {main}() /index.php:0
[16-Oct-2026 14:22:01 UTC] PHP 2. do_action() /wp-includes/plugin.php:517
[16-Oct-2026 14:22:01 UTC] PHP 3. some_plugin_init() /wp-content/plugins/some-plugin/hooks.php:88
[16-Oct-2026 14:22:01 UTC] PHP 4. Some_Plugin_Handler::render() /wp-content/plugins/some-plugin/class-handler.php:142
Pro tip: If the log is empty, no PHP error is being thrown. That usually means it's a CSS/JS conflict, not a PHP conflict — jump to step 4.
Read the stack trace
The stack trace tells you exactly which file threw the error and which files called into it.
Reading order:
- Top frame — the fatal line and file (the actual crash site)
- Bottom frame — the entry point (usually
index.phporwp-blog-header.php) - Middle frames — the call chain (this is where the plugin interaction lives)
Look for plugin paths in the middle frames:
wp-content/plugins/plugin-a/... ← Plugin A involved
wp-content/plugins/plugin-b/... ← Plugin B involved
If two different plugins appear in the stack trace, you've found your conflict. Plugin A called a function that Plugin B was also hooking into, and one of them modified something the other expected.
Pro tip: Note the exact function names in the trace. When you search for a fix, those names are more useful than the plugin names.
Check hook conflicts with Query Monitor
If the log doesn't reveal the culprit, Query Monitor shows exactly which plugin is doing what on each page.
Install and activate Query Monitor. It adds a "Query Monitor" menu to the admin bar with these tabs:
- Queries — every database query with the plugin that ran it
- Hooks — every WordPress hook fired, sorted by priority
- Scripts & Styles — what CSS/JS loads on this page
- HTTP API — outgoing external requests
Look for these patterns in the Hooks tab:
- Two plugins hooking the same action at the same priority
- A plugin removing another plugin's hook (search for
remove_action) - Duplicate function names (search for
function_existspatterns)
Performance warning: Query Monitor slows the site down while it's active. Deactivate it when you're not debugging.
Bisect the plugin list
When you still don't know which plugin is causing the issue, bisect. Faster than testing one at a time.
The bisect method:
- List all active plugins in a spreadsheet
- Deactivate the bottom half
- Reproduce the error
- If the error is gone, it's in the bottom half — restore, deactivate the other half
- If the error is still there, it's in the top half — keep the bottom active, deactivate the top half
- Repeat with the smaller half
Bisect math:
32 plugins → 5 rounds of testing
16 plugins → 4 rounds
8 plugins → 3 rounds
4 plugins → 2 rounds
# vs testing one at a time = up to 32 tests
Pro tip: Do this on staging. If you must do it on production, do it during low-traffic hours and announce it in advance.
Resolve and prevent
Once you've identified the culprit plugin, here's what to do:
If both plugins are required:
- Check if there's a newer version of either plugin. Conflicts are often fixed in point releases.
- Search the plugin support forums on wordpress.org for the exact error
- Report the conflict with a stack trace — the plugin author may not know
- Check the plugin's GitHub issues if it has one
If you can replace one:
- Find an alternative plugin that does the same thing without the conflict
- Or write a small custom function — often faster than dealing with a bloated plugin
Prevent future conflicts:
- Test plugin updates on staging first
- Check the plugin's "Tested up to" version before updating
- Keep fewer plugins active overall
- Read changelogs before updating
📋 Quick reference — where to look for what
| Symptom | Where to look first |
|---|---|
| White screen of death | wp-content/debug.log |
| Site loads but looks broken | Query Monitor → Scripts & Styles |
| Page slow but functional | Query Monitor → Queries |
| Something doesn't work on one page | Query Monitor → Hooks |
| Only some plugins fail | Bisect method |
❓ Frequently asked questions
What is the fastest way to find a WordPress plugin conflict?
Enable WP_DEBUG_LOG, reproduce the error, and read the last plugin file in wp-content/debug.log. That file names the culprit in 80% of cases. If the log doesn't help, use the bisect method on plugins.
Do I need to take the site offline to diagnose a plugin conflict?
No. If you use the bisect method on staging, the live site stays up. If you're debugging on production, do it during low-traffic hours and have a backup ready.
What is Query Monitor used for?
Query Monitor shows which plugin fired which hook, ran which query, and enqueued which script on each page. It's the fastest way to see exactly what a plugin is doing on the page that's breaking.
How do I read a WordPress stack trace?
Look at the frames from top to bottom. The top frame is where the error occurred. The bottom frames are the calling code. Look for plugin paths (wp-content/plugins/) in the middle — that's usually where the conflict lives.
Can I fix a plugin conflict without touching code?
Usually yes. Deactivating one of the two conflicting plugins resolves it immediately. If both plugins are required, you'll need to either update one of them, report the conflict to the plugin author, or find a replacement for one of them.