Plugin conflict. Two words that ruin an afternoon.
A client calls. Their site is broken -- something stopped working after an update, or after adding a new plugin. No error message, just "it's not working."
Here's the systematic process I use to find and fix plugin conflicts fast -- without the trial-and-error that wastes hours.
Why plugin conflicts happen
WordPress plugins hook into the same core functions. When two plugins try to modify the same behavior -- a checkout form, an image upload, a menu item -- they conflict.
Common causes:
- Two plugins using different versions of the same library (jQuery UI, Select2, etc.)
- A plugin adding a filter that breaks another plugin's output
- PHP fatal error in one plugin affecting page rendering
- Two caching/optimization plugins competing for the same assets
- A security plugin blocking requests that another plugin needs
The conflict often appears only on specific pages, or only for logged-in users, or only after a specific action -- which makes it feel random. It isn't.
Step 1: Reproduce it in a predictable way (5 min)
Before touching anything, answer:
- Which page(s) is it broken on?
- Which user roles see the problem?
- When did it start? (What changed?)
- Is it broken on mobile too, or just desktop?
Check the browser console first (F12 -> Console tab). A JavaScript error often points directly to the file -- which tells you the plugin.
# Also check PHP error log on server
tail -50 /var/log/apache2/error.log | grep "wp-content/plugins"
# Or WordPress debug log if enabled:
tail -50 /wp-content/debug.log
Step 2: Enable WP_DEBUG (safely)
Add to wp-config.php temporarily:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false); // Log to file, not screen
WP_DEBUG_DISPLAY false means errors go to debug.log, not visible to visitors. Safe for brief use on production. After fixing, set WP_DEBUG back to false and delete debug.log.
Now reproduce the problem and read the log:
tail -100 /wp-content/debug.log
PHP fatal errors and warnings will name the file and line number. That's your culprit.
Step 3: The deactivation test (classic but systematic)
If the error log doesn't give you a clear answer, deactivate plugins in this order:
- Deactivate the last plugin you installed/updated -- most likely culprit
- Deactivate plugins by category -- security plugins, caching plugins, optimization plugins. Each category often conflicts with others.
- Deactivate all non-essential plugins -- if the problem disappears, reactivate one by one until it returns
Via WP-CLI (faster than the dashboard):
# List all active plugins
wp --allow-root plugin list --status=active --fields=name,version
# Deactivate a specific plugin
wp --allow-root plugin deactivate plugin-slug
# Deactivate ALL plugins at once (nuclear option)
wp --allow-root plugin deactivate --all
# Reactivate one at a time
wp --allow-root plugin activate plugin-slug
The nuclear option (deactivate all) confirms instantly whether the problem is plugin-related at all. If the problem persists with zero plugins active, it's a theme issue.
Step 4: Theme conflict check
Switch to a default theme (Twenty Twenty-Five or Twenty Twenty-Four):
wp --allow-root theme activate twentytwentyfive
If the problem disappears: it's a theme conflict, not a plugin conflict.
If it persists: it may be a WordPress core issue, hosting configuration, or server-side problem.
Step 5: Browser console is your friend
For frontend issues (JavaScript errors, layout breaks, form failures):
Open Chrome DevTools -> Network tab -> reproduce the problem.
Look for:
- Red requests (4xx, 5xx) -- blocked resources or REST API failures
- Console errors mentioning plugin filenames -- tells you which plugin
-
jQuery is not defined-- jQuery load order issue -
Uncaught TypeError-- usually a JavaScript version conflict
The Network tab also shows if two plugins are loading the same library twice (e.g., two copies of Select2 from different paths).
Step 6: Staging environment for complex conflicts
For conflicts that need extended investigation:
# WP-CLI can clone a site
wp --allow-root db export staging_backup.sql
Copy files + database to staging. Work there. When fixed, apply the solution to production.
Never debug complex conflicts on live production by trial and error. One wrong deactivation can break a WooCommerce checkout during business hours.
The most common conflicts I see
Caching plugin + builder plugin
Elementor/Divi cached before assets regenerate. Fix: clear cache after every save, or exclude builder pages from full-page cache.
WooCommerce + checkout optimization plugins
Anything that strips scripts from the checkout page can break payment gateways. Fix: whitelist the payment gateway scripts in the optimization plugin settings.
Security plugin + REST API usage
Security plugins that block REST API endpoints break Gutenberg, WooCommerce, and any plugin that uses the REST API. Fix: whitelist your own domain in the security plugin's REST API settings.
Two SEO plugins
Both injecting meta tags into head. Fix: there should be exactly one SEO plugin per site.
jQuery version mismatch
A plugin that loads its own jQuery (instead of WordPress's enqueued version) breaks every other plugin that expects the standard version. Fix: check which plugin is loading external jQuery and disable that option.
Fixing it without losing data
When you identify the conflict:
Option 1: Configure one plugin to not conflict -- most plugins have settings to disable specific features. A security plugin can whitelist certain URLs; an optimization plugin can exclude certain scripts.
Option 2: Replace one plugin -- if two plugins do overlapping things, pick one and remove the other. Running both a caching plugin and a CDN with caching enabled is a common example.
Option 3: Update both plugins -- sometimes the conflict is a known bug that's been fixed. Check changelogs.
Option 4: Contact plugin support -- for paid plugins, this is part of what you paid for. Describe the conflict specifically: plugin A version X conflicts with plugin B version Y on WordPress Z.
Preventing conflicts in the first place
- Test updates on staging before pushing to production
- Don't install two plugins that do the same job
- Read plugin changelogs before updating
- Keep an update log (date, what changed, any issues)
My automation script does a backup before every update, sends a post-update health check, and emails me if anything looks wrong. That's the safety net that makes updates non-stressful.
The automation that makes this manageable
Manual conflict investigation across 10 client sites after updates is painful. My maintenance scripts:
- Backup before every update
- Run
wp doctor check --allpost-update - Check that the site responds (HTTP 200) after updates
- Alert if anything changed in core file checksums
# Post-update health check
wp --allow-root core verify-checksums
wp --allow-root plugin verify-checksums --all
wp --allow-root doctor check --all
curl -o /dev/null -s -w "%{http_code}" https://clientsite.com
If the site returns anything other than 200 after an update, I get an alert before the client notices.
The full script bundle (bulk updates + post-update health checks + alerting):
WordPress Agency Automation Bundle -- use CHECKLIST for 15% off.
Or grab the free monthly maintenance checklist to see what a full maintenance workflow looks like:
WordPress Monthly Maintenance Checklist
Related articles
- I automated WP maintenance across 8 client sites
- WordPress security: 10-minute monthly checklist
- WordPress site running slow? 30-min diagnosis
- MainWP vs ManageWP vs custom scripts
WordPress backups: the strategy that actually protects client sites
15 AI prompts for tech freelancers (the uncomfortable ones included)
All paid tools: devautomation.gumroad.com
What's the most frustrating plugin conflict you've run into on a client site? Drop it in the comments.
Top comments (0)