How to Find and Fix a WordPress Plugin Conflict, Without Guessing
“Plugin conflict” isn’t a symptom — it’s a diagnosis, and most people reach it by process of elimination after everything else has been ruled out. This is the structured way to actually find the pair responsible, instead of deactivating things at random and hoping.
What is the problem?
Every other guide in this library starts from something you can see — a blank page, a stuck editor, a checkout that won’t complete. This one is different, because “plugin conflict” isn’t what you see, it’s the conclusion you reach once you’ve ruled out a server problem, a single broken plugin, and a theme issue. Something on your site stopped working — right after you installed or updated a plugin — and the actual cause is two (or occasionally three) pieces of code stepping on each other, neither one broken on its own.
Quick answer: don’t start by guessing which plugin is at fault. Start by proving whether it’s a conflict at all, using WordPress’s own troubleshooting mode, which isolates the problem on your screen only — visitors keep seeing the site normally the entire time you test.
This matters because the fix is completely different depending on what you find. A single broken plugin gets updated, replaced, or reported to its developer. A genuine conflict between two working plugins needs a different kind of fix — often a load-order change, a compatibility setting, or picking one plugin over the other — and applying a single-plugin fix to a two-plugin problem just wastes your afternoon.
Common symptoms
- A feature that worked yesterday stopped working right after you installed or updated a plugin — the timing is the biggest clue you have
- The browser console shows an error naming a specific script file, often ending in
.min.js, or a message like “$ is not a function” pointing at a jQuery-related clash - A fatal PHP error names a function or class that sounds like it could belong to either of two active plugins
- Layout or spacing breaks on some pages but not others, rather than site-wide, which usually means it’s tied to a specific plugin’s output, not a global stylesheet
- Requests to
admin-ajax.phpfail with a 400 or 500 status in the Network tab, often on a form, filter, or interactive element - A button, form, or interactive widget appears normal but does nothing when clicked, with no visible error at all on the page itself
Why does this happen?
WordPress plugins are built independently, by different teams, on different schedules, and almost never tested against each other directly — there are tens of thousands of active plugins, and no developer can realistically test their code against all of them. Most of the time this works out fine, because plugins are supposed to hook into WordPress through a shared, well-documented system of actions and filters that’s designed to let many plugins coexist.
The trouble starts when two plugins both need the same narrow piece of ground — the same script library, the same hook, the same database key, the same visual real estate on a page — and neither one was written expecting the other to be there. Individually, both plugins pass their own testing. Together, on your specific site, with your specific combination of theme and other plugins, one of them loses.
Common technical causes
- Two plugins both loading their own version of a shared JavaScript library — jQuery, Select2, and Swiper are the most common — leaving the browser with two versions fighting over the same global object
- Two plugins hooking the same WordPress action or filter at different priorities, where whichever one runs last silently overwrites the other's change without either plugin knowing
- A CSS specificity fight between two plugin stylesheets both trying to style the same element, producing layout that looks broken but isn’t actually a bug in either file
- A PHP function or class name collision, where two plugins weren’t written with distinct enough naming prefixes and one triggers a fatal “cannot redeclare” error
- Two plugins writing to the same database option or transient key, each overwriting the other's stored value on save
- A security or firewall plugin blocking another plugin's own REST API or AJAX request as if it were suspicious traffic, because it doesn't recognise the request pattern as legitimate
- A plugin update shipping a genuinely breaking change that only shows up when one specific other plugin is also active, which is why it can pass the developer's own testing and still break your site
How to diagnose it
- Open the browser console and read the exact error. Press F12, click Console, reproduce the problem, and write down the script file or function name mentioned — this alone often narrows it to one plugin before you test anything.
- Install Health Check & Troubleshooting, the official free plugin from WordPress.org, and switch on its Troubleshooting Mode. This disables every other plugin and switches to a default theme, but only for your own logged-in session — every visitor keeps seeing the live site normally the whole time.
- Check if the problem is gone in Troubleshooting Mode. If it is, you've confirmed it's a plugin or theme conflict, not a server or core issue. Re-enable plugins one at a time from inside that same mode, checking after each, until the problem comes back — the last one you enabled is your culprit, or half of it.
- If you'd rather not install another plugin, do it manually. Go to Plugins, note which ones are active, deactivate all of them, confirm the site works, then reactivate one at a time via Bulk Actions, testing after each.
- Install Query Monitor, another free WordPress.org plugin, to see every hook, filter, database query and PHP notice firing on a page load. It can point directly at which plugin's code is running at the exact moment something breaks, often skipping the trial-and-error entirely.
- Search the flagged plugin's support forum for “conflict” alongside the name of the other plugin involved. This exact pairing has very often already been reported and sometimes already has a documented fix.
How to fix it, step by step
- Confirm the exact pair before changing anything. Use the diagnosis steps above to name both plugins with confidence — fixing blind based on a guess wastes time and risks breaking something unrelated.
- Check both plugins for a recent update. Update the older one first; a real percentage of conflicts get silently resolved by a version bump neither plugin advertised as a “conflict fix.”
- If one plugin is clearly replaceable, swap it. A functionally similar alternative that doesn't clash is often faster to implement than waiting on either developer to patch a niche conflict.
- For a shared-library version mismatch, check whether either plugin has a compatibility setting, a “load scripts in footer” option, or a way to defer its own copy of the library — this resolves load-order clashes without touching either plugin's core files.
- For a hook-priority collision, a short custom code snippet adjusting one hook's priority can resolve it cleanly if you're comfortable writing and testing one — this is the one step on this list that benefits from developer experience.
- For a security plugin blocking a legitimate request, add a specific allow-rule for that endpoint rather than disabling the whole firewall, which trades one problem for a bigger one.
- Test the fix inside the same Health Check troubleshooting mode before trusting it, then confirm it holds with everything reactivated and running normally.
- Write down which two plugins conflicted and what fixed it. The same pairing can resurface after either plugin's next update, and this note saves you re-diagnosing from scratch.
- If the site is business-critical, test on a staging copy first rather than deactivating plugins on the live site while customers or visitors are using it.
When this needs professional help
Plenty of plugin conflicts are realistic to isolate and fix yourself with Health Check and a bit of patience. It's worth bringing in a developer when:
- The conflict only reproduces on the live site, and Troubleshooting Mode doesn't quite replicate the conditions that trigger it
- The actual fix needs a small custom code snippet — adjusting a hook priority, for example — and you're not confident writing or safely testing one
- The same conflict keeps resurfacing after every update cycle, which usually means neither plugin developer has permanently fixed it upstream
- You've isolated two genuinely essential plugins that conflict and neither one has a workable substitute
- The site is business-critical and you don't have a staging environment to test deactivation safely
How I can help
This is one of the more genuinely time-consuming problems in this library, because the fix depends entirely on correctly identifying the pair first — and after eleven years of freelance WordPress work, I've built a fast, evidence-based process for exactly that: browser console, Query Monitor, and isolated testing rather than deactivating things at random. Once the actual conflict is confirmed, I apply the smallest fix that resolves it and survives the next update, not a patch that quietly breaks again in a month.