Canonical Tags in WordPress
How WordPress core handles canonicals on singular content, what it leaves out, and how to add or override them with or without a plugin.
Drupal core auto-canonicalizes nodes, but Views, aliases, and Metatag can still create duplicates.
Yes, on modern Drupal. Drupal 8, 9, and 10 core automatically emits a self-referencing rel="canonical" link in the <head> of every canonical entity route, most importantly node (content) pages, and also taxonomy term pages and user pages. Core builds this as an attachment on the page's build array, pointing at the entity's canonical URL, which is its clean path alias if you're running Pathauto, or the raw /node/123 path if you aren't. That means a stock Drupal 9 or 10 site ships correct self-referencing canonicals on standard content pages with zero contributed modules installed.
There's an important nuance, though. Core's automatic canonical is reliable specifically for canonical entity routes. It does not intelligently handle Views pages, listing or pager pages, faceted or filtered pages, query-string variants like UTM parameters, or many custom entity routes. Those are precisely the gaps the Metatag module exists to fill.
Drupal 7 is a different story, and this is where a lot of outdated advice gets people in trouble. Drupal 7 core does not consistently output a canonical tag on content the way Drupal 8 and later do. In practice, canonical tag management on Drupal 7 sites is handled by the Metatag module and its add-ons. If you're auditing a Drupal 7 site and see canonicals working correctly, thank Metatag, not core, and hedge any "Drupal handles this automatically" advice accordingly when the version is 7.
The contributed Metatag module is the standard way Drupal site builders control canonical and other meta and <head> tags beyond what core provides. It offers a global default configuration plus per-entity-bundle defaults, meaning you can set different canonical behavior for, say, articles versus basic pages. On Drupal 8, 9, and 10 that configuration lives at admin/config/search/metatag; older or Drupal 7 installs use the equivalent admin/config/search/metatags path.
Metatag ships submodules for things like Open Graph, Twitter Cards, Verification, and hreflang, but the canonical field itself is not a separate submodule. It's part of Metatag's core "Advanced" group, labeled Canonical URL. Don't assume a dedicated "Metatag: Canonical" module exists, because it doesn't; canonical control is built into base Metatag.
The Canonical URL field's default value is the token [current-page:url], though older documentation and some Drupal 7 installs reference node-context tokens like [node:url] instead. Both resolve to the current entity's URL. You can configure this at three levels: globally, per content type as a bundle default, or on an individual node's edit form, under the Meta tags field group's Advanced section, which overrides whatever the bundle default says. That per-node override is also how you point a specific piece of syndicated content at an external, original-source URL instead of a token, telling search engines the canonical version lives elsewhere.
Pathauto generates human-readable URL aliases from patterns, commonly built from tokens like the node title. Both core's automatic canonical and Metatag's [current-page:url] and [node:url] tokens resolve to that aliased URL, not the raw /node/123 path, so canonicals on a well-configured Drupal site normally point to the pretty alias. On multilingual sites using a language path prefix, the canonical resolves per language, so a French page canonicalizes to something like /fr/blog/.... That's intended behavior, and it pairs correctly with hreflang. The practical implication is that changing a URL alias changes the canonical target, so alias changes deserve the same care you'd give a URL redesign.
Views is where Drupal's canonical handling has historically broken down. Canonicals on Views-generated pages have resolved incorrectly in documented ways: including the query string in the canonical URL, or having every paged result, such as a page with ?page=2 in the URL, canonicalize to itself rather than pointing to a single consolidated URL for the whole listing. Neither core nor a default Metatag install fixes this automatically; it requires explicit Metatag configuration on the View itself. If your Views-driven listing pages are self-canonicalizing each paginated variant, that's a configuration gap, not an unavoidable Drupal limitation. The same is true for custom entity routes and query parameters like UTM tags: core won't strip them or canonicalize them on its own, so Metatag configuration is required there as well.
Because Drupal core already adds a canonical tag as a build-array attachment on entity routes, a well-known class of bug shows up when something else also adds one. If a configuration or an older Metatag build layers its own canonical on top of core's, the page ends up with two canonical links in the <head>, and search engines faced with two conflicting canonical signals may choose to ignore both.
Metatag's maintainers addressed this directly by adding logic that detects core's canonical and removes it before adding its own, a fix committed to the 8.x-1.x branch in May 2016. That fix is old and stable, but duplicate-canonical issues still recur in the wild, particularly on taxonomy term pages, with certain contrib modules that add their own head markup, or with hand-edited templates that hard-code a canonical link. The only reliable way to catch this is to view source and confirm there is exactly one canonical tag on the page, not to assume the module fix covers every case.
It's also worth restating what a canonical tag actually is here: a hint, not a redirect. Even a perfectly configured, single canonical tag doesn't stop Drupal from serving the duplicate URL to a visitor or a crawler that requests it directly. If you need hard enforcement of one URL, pair the canonical with the Redirect module and issue real 301s; the canonical tag by itself won't make the duplicate URL disappear.
No. Drupal 8, 9, and 10 core emits self-referencing canonicals on entity routes without any contributed module. Drupal 7 core does not do this consistently, so canonical management on Drupal 7 sites is handled by the Metatag module instead.
In the Metatag module, go to admin/config/search/metatag on Drupal 8, 9, or 10 (older or Drupal 7 installs use admin/config/search/metatags), choose the Global or content-type default, and configure the Canonical URL field under the Advanced group.
This happens when Drupal core's automatic canonical and a Metatag-generated canonical, or a hand-coded template canonical, both output a link. Metatag added logic in 2016 to remove core's duplicate, but the issue still recurs on term pages, with certain contrib modules, or in custom templates, so always view source to confirm only one is present.
Yes. Core's canonical and Metatag's default tokens resolve to the entity's current alias, so if you change a node's URL alias, its canonical target changes with it.
No. A canonical tag is a hint to search engines, not a redirect; it does nothing to stop the duplicate URL from loading. For true consolidation, pair it with the Redirect module and issue an actual 301.
How WordPress core handles canonicals on singular content, what it leaves out, and how to add or override them with or without a plugin.
How Yoast SEO adds self-referencing canonicals across your whole WordPress site, where to override them, and how to fix a wrong canonical.
How Wix sets a default canonical for every page, how to override it, and the sitemap side effect you need to watch for.