---
title: "Hreflang and canonical tags: how to use them together"
description: "Each language version is its own canonical and lists every alternate. The conflicts that break hreflang, with HTML examples and a check for live pages."
url: "https://www.langrelay.com/blog/hreflang-and-canonical-tags"
---

1. [Home](https://www.langrelay.com/)
2. [Blog](https://www.langrelay.com/blog)
3. Hreflang and canonical tags: how to use them together

ArticleMultilingual SEO

# Hreflang and canonical tags: how to use them together

Each language version is its own canonical and lists every alternate. The conflicts that break hreflang, with HTML examples and a check for live pages.

[Chris Jayden](https://www.langrelay.com/about)

Founder

Published

6 October 2026

Reading time

6 min read

![One friend steps off a water taxi to meet another under umbrellas on a rainy canal bridge, beside a railing of green and orange leaf tiles.](https://www.langrelay.com/_emdash/api/media/file/01M4ET4J1TM0CNCXTT68FNPSSJ.webp)

On this page

1. What is the difference between canonical and hreflang?
2. The rule in markup
3. Five conflicts and how to fix each
4. 1. Translated pages canonicalized to the original
5. 2. Hreflang pointing at a URL that is not canonical
6. 3. Hreflang attached to the canonical tag
7. 4. A version in the set that is not indexable
8. 5. Regional versions in the same language
9. Where this goes wrong on WordPress
10. How do you check a live page?

Give every language version of a page a canonical tag that points at itself, and give it an hreflang set that lists every version, itself included. The French page is canonical for French, the Spanish page for Spanish, and the hreflang set ties them together. On WordPress the usual break is a translated page whose canonical points back at the original.

## What is the difference between canonical and hreflang?

A canonical tag answers "which URL should be indexed when several URLs show the same content?" Google's documentation calls it a hint: Google can pick a different canonical than the one you declare.

An hreflang set answers a different question: "which of these URLs, each in its own language, should a given searcher see?" Google can only show a URL it has indexed, so the set helps only for versions that are.

Canonicalization only merges language versions when Google treats them as duplicates, and its canonicalization page says a translation isn't one: "Different language versions of a single page are considered duplicates only if the primary content is in the same language." A page with a translated menu and footer but an untranslated body counts as a duplicate. A page whose body is in French does not.

Both tags only matter once each language has its own URL. The article on [subdomain vs subdirectory for a multilingual website](https://www.langrelay.com/blog/subdomain-vs-subdirectory-multilingual-seo) compares the URL structures, and the one on [machine translation and SEO](https://www.langrelay.com/blog/does-machine-translation-hurt-seo) covers when a machine-translated version is ready to join the set.

## The rule in markup

A ceramics shop sells in English, French and Spanish, with Australian English as a regional version. This is the head of its Spanish product page:

```
<link rel="canonical" href="https://www.tilestudio.example/es/handmade-tiles/">
<link rel="alternate" hreflang="en" href="https://www.tilestudio.example/handmade-tiles/">
<link rel="alternate" hreflang="en-AU" href="https://www.tilestudio.example/en-au/handmade-tiles/">
<link rel="alternate" hreflang="fr" href="https://www.tilestudio.example/fr/handmade-tiles/">
<link rel="alternate" hreflang="es" href="https://www.tilestudio.example/es/handmade-tiles/">
<link rel="alternate" hreflang="x-default" href="https://www.tilestudio.example/handmade-tiles/">
```

The canonical names the Spanish URL. The `es` alternate names the same URL, character for character. The French page carries the same five alternate lines with a canonical naming the French URL, and so on for each version, as Google's page on localized versions asks: "Each language version must list itself as well as all other language versions." Google's documentation on canonical URLs states the hreflang half of this directly: when you use hreflang, specify a canonical page in the same language, or the closest substitute language if no same-language page exists.

## Five conflicts and how to fix each

### 1. Translated pages canonicalized to the original

```
<!-- On https://www.tilestudio.example/fr/handmade-tiles/ -->
<link rel="canonical" href="https://www.tilestudio.example/handmade-tiles/">
<link rel="alternate" hreflang="fr" href="https://www.tilestudio.example/fr/handmade-tiles/">
```

The canonical asks Google to index the English page instead of this one, while the alternate asks it to show this one to French searchers. Google receives two instructions that cannot both be followed. Since canonicals are hints, it may resolve them either way, and you lose control over which French URL, if any, appears in results.

This conflict often starts with a translation layer that serves `/fr/` from the same WordPress post as the original. The theme or SEO plugin prints the canonical for the post it knows, which is the English one, and nothing rewrites it on the French response. Fix it by making each translated response carry its own URL as canonical.

### 2. Hreflang pointing at a URL that is not canonical

```
<link rel="alternate" hreflang="fr" href="http://tilestudio.example/fr/handmade-tiles">
```

The canonical French URL is `https://www.tilestudio.example/fr/handmade-tiles/`. This tag names a variant on HTTP, without `www` and without the trailing slash. Each difference leads to a redirect or a duplicate, and the return link from the French page names a different string. Google's canonical documentation asks for HTTPS URLs in hreflang annotations and says Google prefers URLs that are part of an hreflang cluster when it picks a canonical. Use exactly the URL each version declares as its own canonical.

### 3. Hreflang attached to the canonical tag

```
<link rel="canonical" hreflang="es" href="https://www.tilestudio.example/es/handmade-tiles/">
```

Google's documentation says `rel="canonical"` annotations carrying `hreflang`, `lang`, `media` or `type` attributes are not used for canonicalization. The tag above does nothing as a canonical. Keep the canonical as a plain tag and list languages in separate `rel="alternate"` tags.

### 4. A version in the set that is not indexable

If the French page has `noindex`, its hreflang entries point at a page that will not be indexed. Google's canonical documentation also advises against `noindex` as a way to choose a canonical within a site, because it removes the page from Search altogether. Take a version out of the set until it is ready, rather than listing it and hiding it.

### 5. Regional versions in the same language

`en` and `en-AU` versions of a product page may differ only in price, spelling and delivery details. Here the pages are close to duplicates, and Google's canonicalization page says to use both canonicalization and hreflang for same-language regional variants. In practice that means each regional page stays self-canonical and lists the others. If two regional pages are identical, consider whether you need both. For similar same-language content on two URLs, Google's guidance on multi-regional sites says to pick a preferred version and use canonical and hreflang tags so searchers get the right regional URL.

## Where this goes wrong on WordPress

WordPress core prints a canonical tag on single posts and pages (its `rel_canonical()` function), and an SEO plugin may print its own instead. A translation plugin that stores each language as a separate post gets a separate canonical per language from WordPress itself. A plugin that translates the rendered page serves `/fr/` from the original post, so it has to rewrite the canonical in the response, or the French page goes out declaring the English one canonical, which is conflict 1 even though nobody chose it.

LangRelay's plugin translates the rendered page and handles that rewrite. On a translated response it points the existing canonical tag, and the `og:url` tag, at the page's own translated URL, and adds a canonical if the page had none. It sets `lang` on the `<html>` element to the language's tag and prints the hreflang set that LangRelay sends, which is the same on every version and includes the page itself and `x-default` on the original.

Once French is live on at least one page of the site, a `/fr/` URL whose own French translation is not approved yet returns the original page's content, and the plugin prints no hreflang set on that response. Any canonical tag in it still names the original, which is correct for a page that is not in French. When the translation is approved and published, LangRelay fetches the translated URL and checks that the canonical points at that URL, that the page lists itself and `x-default` in its hreflang set, and that `lang` matches. A page that contradicts any of these is flagged on the release instead of being reported as delivered.

## How do you check a live page?

The browser's element inspector shows the page after scripts ran. Search engines start from the HTML your server sends, so check that first:

```
curl -s https://www.tilestudio.example/es/handmade-tiles/ \
  | grep -iE 'rel="(canonical|alternate)"'
```

Then work through the output:

1. The canonical matches the URL you requested, scheme, host and trailing slash included.
2. The hreflang entry for this page's language names that same URL.
3. Each other URL in the set returns 200 when requested, without a redirect.
4. Each of those pages has its own self-canonical and the same set.
5. No `noindex` appears on any version, in a meta tag or an `X-Robots-Tag` header.

For pages that are already indexed, Search Console's URL Inspection tool shows the "User-declared canonical" next to the "Google-selected canonical". If Google picked the original for a translated URL, look for conflict 1 or for a body that is still mostly in the original language. The help page notes that the Google-selected canonical is only available from indexed data; a live test cannot predict it.

The [hreflang guide](https://www.langrelay.com/guides/hreflang) covers the codes and the rest of the set's rules, and [self-referencing hreflang and x-default](https://www.langrelay.com/blog/self-referencing-hreflang-x-default) covers the two entries this article only touches on. For the WordPress side, see [hreflang in WordPress](https://www.langrelay.com/blog/hreflang-wordpress) and the [multilingual SEO](https://www.langrelay.com/multilingual-seo) overview. If you want to see the plugin's output on one of your own pages, [book a demo](https://www.langrelay.com/book-a-demo).

## Sources

The pages this one cites, with the day each was read.

1. 01[How to specify a canonical with rel="canonical" and other methods (Google Search Central, last updated 2026-07-10)](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)developers.google.com, checked 6 October 2026
2. 02[What is URL canonicalization (Google Search Central, last updated 2026-08-20)](https://developers.google.com/search/docs/crawling-indexing/canonicalization)developers.google.com, checked 6 October 2026
3. 03[Localized versions of your pages (Google Search Central, last updated 2026-09-21)](https://developers.google.com/search/docs/specialty/international/localized-versions)developers.google.com, checked 6 October 2026
4. 04[Managing multi-regional and multilingual sites (Google Search Central, last updated 2025-12-10)](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites)developers.google.com, checked 6 October 2026
5. 05[URL Inspection tool (Search Console Help)](https://support.google.com/webmasters/answer/9012289)support.google.com, checked 6 October 2026
6. 06[rel\_canonical() (WordPress Developer Resources)](https://developer.wordpress.org/reference/functions/rel_canonical/)developer.wordpress.org, checked 6 October 2026

[Chris Jayden](https://www.langrelay.com/about)

Founder, LangRelay

Chris Jayden is the founder of LangRelay. Chris has worked on websites of every size, from large e-commerce stores to small sites with a handful of pages, and started LangRelay after years of translating them the hard way.

On this page

1. What is the difference between canonical and hreflang?
2. The rule in markup
3. Five conflicts and how to fix each
4. 1. Translated pages canonicalized to the original
5. 2. Hreflang pointing at a URL that is not canonical
6. 3. Hreflang attached to the canonical tag
7. 4. A version in the set that is not indexable
8. 5. Regional versions in the same language
9. Where this goes wrong on WordPress
10. How do you check a live page?

Share

- [Share on LinkedIn (opens in a new tab)](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fwww.langrelay.com%2Fblog%2Fhreflang-and-canonical-tags)
- [Share on X (opens in a new tab)](https://x.com/intent/post?url=https%3A%2F%2Fwww.langrelay.com%2Fblog%2Fhreflang-and-canonical-tags&amp;text=Hreflang%20and%20canonical%20tags%3A%20how%20to%20use%20them%20together)

See it on your site

A 30-minute walkthrough on one of your pages.

[Book a demo](https://www.langrelay.com/book-a-demo)

- canonical
- hreflang
- multilingual SEO

## Keep reading

- Article
  ### [Hreflang in WordPress: how plugins print it and how to check](https://www.langrelay.com/blog/hreflang-wordpress)
  Where hreflang comes from on WordPress, what WPML, Polylang, TranslatePress and Weglot print by default, how Yoast SEO and Rank Math fit in, and how to check.

Book a demo

## See LangRelay on your own site

Book 30 minutes with the team. We translate one of your pages live and walk through review, publishing and multilingual SEO.

[Book a demo](https://www.langrelay.com/book-a-demo)[See pricing](https://www.langrelay.com/pricing)
