New 1 in 3 AI local recommendations is wrong — is yours? · Discover
Livada.io
Blog
SEO··3 min read

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.

Florin Livada
Founder, Livada.io · Made in France

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.