Duplicate Canonical Tag on WordPress: How to Find the Real Culprit
Two canonical tags on the same page. Google keeps only one, essentially at random. The question that matters isn't 'is there a conflict' but 'who caused it' — and almost no tool answers that.
You inspect a page's source code. You see this:
<link rel="canonical" href="https://yoursite.com/double-room/">
<link rel="canonical" href="https://yoursite.com/double-room/?elementor_library=…"> Two canonical tags. Google keeps only one, at the whim of its own judgment — and it isn't necessarily the right one.
Simple question. Almost never an obvious answer: who wrote the second one?
Why it's harder than it looks
On a typical WordPress site, at least four actors can write a tag into the page's <head> on the same day, without talking to each other:
- Your SEO plugin (Yoast, Rank Math, SEOPress, Livada…)
- Your theme, which often has its own minimal built-in SEO block
- Elementor or Elementor Pro, which generates its own metadata on certain templates
- A snippet added one day to functions.php or via a code plugin, and forgotten ever since
Each one acts "legitimately" from its own point of view. The result, however, isn't.
What most tools tell you (and what they don't)
A standard SEO audit — yours included, probably — will tell you: "duplicate canonical detected". That's the symptom. It almost never tells you the source: which plugin, which hook, which file.
You end up disabling plugins one by one to find the culprit. It works, but it takes an hour on a site you don't know by heart — and it's risky in production.
How Provenance Watch answers the question differently
Provenance Watch doesn't just detect that a tag exists twice. It traces back through WordPress's execution chain (the hooks/actions mechanism that builds every page) to identify:
- Which component produced the tag — plugin, theme, or WordPress core
- The file where that code actually lives (via PHP Reflection, not a guess based on a function name that sounds like something)
- The priority at which it ran — useful for understanding which of the two "won" in the display order
Tag detected
<link rel="canonical" href="…">
Origin
Elementor Pro — conflicting with Livada SEO
The responsible file is identified — not just a plugin name. What this proves, precisely: the file and component that actually wrote the tag, resolved by the PHP engine itself. What it doesn't claim to do: give an exact line number within that file — attribution stops at the file and its owner, no further.
What this changes in practice
Instead of disabling plugins blindly, you know within 30 seconds where to act: a setting to change in Elementor, a filter to remove from a forgotten snippet, or simply the confirmation that the conflict comes from two SEO plugins active at the same time (a common case after an incomplete migration — see our guide on verifiable migration).
On a client site, it's also the difference between "I think it's fixed" and "here's exactly what was causing the problem, and why it won't come back."
See Provenance Watch in action →
Written from the actual code of Livada SEO v1.50.3 (class-hook-attribution.php, class-provenance-watch.php), verified on 22 August 2026.
Ready to stop wasting time?
Livada SEO + Cockpit give you the pro tools to take action — tested on real hotels and campsites.