DEV Community

devautomation
devautomation

Posted on

WordPress plugin conflicts: how to diagnose and fix them without breaking client sites

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. Deactivate the last plugin you installed/updated -- most likely culprit
  2. Deactivate plugins by category -- security plugins, caching plugins, optimization plugins. Each category often conflicts with others.
  3. 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. Backup before every update
  2. Run wp doctor check --all post-update
  3. Check that the site responds (HTTP 200) after updates
  4. 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
Enter fullscreen mode Exit fullscreen mode

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

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)