Skip to content

"Alternate page with proper canonical tag" in Search Console: what it means on a WordPress site

"Alternate page with proper canonical tag" is not an error. The address listed is a copy of another page, it says so with a canonical link, and Google agreed and indexed the other page. Google's help says there is nothing you need to do. Look closer only if a page you want found is on the list.

By
WP Ministry
Published
Tested on
WordPress 7.1.3, PHP 8.3.35

In short

  • Nothing is wrong. Google's help says the page "correctly points to the canonical page, which is indexed, so there is nothing you need to do".
  • WordPress prints a canonical link on every post and page, built from its permalink. An address with a tracking parameter or capital letters names the clean one.
  • Archives, a home page that lists posts and search results print no canonical link, so they cannot be reported under this status.
  • It points at a mistake only when a page you want found is on the list. Read that page's canonical link and see what it names.
  • The link takes its host name from the Site Address setting, and says https when that setting does. A plugin's field or a line of code can replace it.
  • Do not add noindex or a robots.txt rule to the copies. Google's documentation advises against both.

"Alternate page with proper canonical tag" is not an error, and nothing needs fixing. The address listed is a copy of another page. It says which page is the original with a canonical link, and Google agreed and indexed the original. Google's help for the report says of this status: "This page correctly points to the canonical page, which is indexed, so there is nothing you need to do."

Two questions remain: why a WordPress site has these extra addresses, and how to spot the cases where the status points at a mistake. Both come down to reading the canonical link a page prints.

What the status means, in Google's words

The Page indexing report lists the status under "Why pages aren't indexed", with "Website" as its Source. Google's help defines it in three sentences:

  • "This page is marked as an alternate of another page (that is, an AMP page with a desktop canonical, or a mobile version of a desktop canonical, or the desktop version of a mobile canonical)."
  • "This page correctly points to the canonical page, which is indexed, so there is nothing you need to do."
  • "Alternate language pages are not detected by Search Console."

The examples in that definition are AMP and mobile pages. The same help page says that where a site "uses parameters to filter or sort a common collection", those pages "will be labeled as 'duplicate' or 'alternate'" in the report.

The addresses under the reason are a sample: "an example list of pages affected by this issue" that "is limited to 1,000 rows".

"Duplicate without user-selected canonical" is a different status. There the page "doesn't indicate a preferred canonical page", and Google chose one by itself. The help adds: "This is not an error, but is working as intended". The difference is who named the original: under this page's status your page did and Google agreed, and under the Duplicate status your page named nothing. On WordPress the split follows which pages print a canonical link.

Why a WordPress site has these addresses

WordPress prints a canonical link on every single post and page. It builds the link from the item's permalink, not from the address that was asked for, so every other address that shows the same post names the permalink as the original. WordPress SEO without a plugin lists what else WordPress prints.

This command reads the link from any address:

bash
curl -s "https://example.com/oak-table-care/?utm_source=newsletter" | grep -o '<link rel="canonical"[^>]*>'
text
<link rel="canonical" href="https://example.com/oak-table-care/" />

With no terminal, search the page's source in a browser for rel="canonical", or use the page indexing check, which reads the canonical link too.

On a new WordPress with "Post name" permalinks and no plugin, a post at /oak-table-care/ answered like this:

Address asked forAnswerCanonical link printed
/oak-table-care/?utm_source=newsletter, ?fbclid=…, ?ref=…200/oak-table-care/
/Oak-Table-Care/200/oak-table-care/
/oak-table-care/?replytocom=2200/oak-table-care/, beside a noindex robots tag
/oak-table-care/embed/200/oak-table-care/, beside a noindex robots tag
/oak-table-care/2/, the second page of a post split with a page break200Itself: /oak-table-care/2/
/oak-table-care/comment-page-1/200Itself, with #comments on the end
/?p=4, /oak-table-care with no slash301 to /oak-table-care/None: no page is sent
/oak-table-care/amp/404None

Four things follow from the table.

  • A parameter WordPress does not know is ignored. The page answers 200 and names the clean address. A link shared with a tracking parameter attached is an address of this kind. Capital letters behave the same way: WordPress does not redirect them, and the link names the lowercase address.
  • WordPress makes two of the copies itself. The Reply link under each comment is the post's address with ?replytocom= added, and every post has an /embed/ form. Both name the post as canonical and carry noindex as well, so Google may report them under its noindex reason instead.
  • Not every extra address is a copy by its own tag. The second page of a split post names itself. So does a comment page, which answers at any number whether or not "Break comments into pages" is ticked, and whose link ends in #comments. With the oldest comments shown first, comment-page-1 names the post, again with #comments. Google's documentation says not to "specify a URL fragment as canonical", so how it files those is its own decision.
  • An address that redirects is another status. WordPress prints /?p=4 in each post's head as a shortlink, and it answers with a 301: see Page with redirect. WordPress has no AMP form of a page unless a plugin adds one.

Some pages print no canonical link at all: a home page that lists the latest posts and its /page/2/, category and author archives, and search results. One of those with a parameter added answers 200 and names nothing. By Google's definitions it can be a "Duplicate without user-selected canonical", never an alternate with a proper canonical tag. Search results also carry noindex.

A store adds more of both kinds. A variation's address carries a canonical link to its product. Sorted and filtered lists and category pages carry none.

When the status is a sign of a mistake

The status is a problem only when an address on the list is one you want people to find in search. Start with the first fix. The others apply when it turns such a page up, or when the site itself keeps making copies.

What not to do

  • Do not add noindex to the copies. Google: "We don't recommend using noindex to prevent selection of a canonical page within a single site, because it will completely block the page from Search. rel="canonical" link annotations are the preferred solution." Yoast SEO's help adds that it prints no canonical tag on a page marked noindex.
  • Do not block them in robots.txt. Google: "Don't use the robots.txt file for canonicalization purposes. Google may still index URLs that are disallowed in robots.txt without their content."
  • Do not ask for their removal. The same page says the URL removal tool "hides all versions of a URL from Search".
  • Do not redirect an address that is still in use. Google says to use a redirect "only when deprecating a duplicate page". An address with a tracking parameter is still used by whoever shared it.

"Validate fix" and URL Inspection

The status needs no validation. The first step of "Validate fix" in Google's help is "Fix all instances of the issue on your site", and validation "will stop when Google finds a single remaining instance of that issue". Here the instances are meant to stay. The help also says: "You can also fix issues without validating; Google updates your instance count whenever it crawls a page with known issues".

If you did correct a real mistake, validation is a request to Google and not a switch. The help says it "typically takes up to about two weeks, but in some cases can take much longer".

URL Inspection shows two fields for an address. "User-declared canonical" is the one your page names: "If your page explicitly declares a canonical URL, it will be shown here." "Google-selected canonical" is, in the help's words, "The page that Google selected as the canonical (authoritative) URL when it found similar pages on your site". The tool's live test cannot confirm a correction: the help says "duplicate or canonical conditions are not tested in the live test".

A canonical link is itself a request. Google's words: "indicating a canonical preference is a hint, not a rule." Whether and when it indexes a page that now names itself is Google's decision.

If pages you want found stay on the list and their links look right, WP Ministry's WordPress SEO audit looks at the address each page asks to be listed under, and at the extra addresses WordPress and its plugins make for one piece of content.

What causes it

  • The address is a copy of a post or page, and says so

    Common

    WordPress builds a post's canonical link from its permalink, not from the address that was asked for. A post reached with a tracking parameter or with capital letters therefore names the clean address, and Google lists the copy here.

    Fix: Check that the listed addresses are copies, then leave them

  • Code on the site points the canonical link at another page

    Sometimes

    WordPress passes every canonical link through a filter. A line in a theme, a plugin or a must-use plugin can replace it, for example with the home page on every post. Each post then tells Google it is a copy.

    Fix: Find the code that points the canonical link at another page

  • An SEO plugin's canonical field holds another page's address

    Sometimes

    An SEO plugin gives each post a field for a canonical address. What is typed there replaces the address the plugin would have used, and it stays until someone clears it.

    Fix: Clear a canonical address typed into an SEO plugin

  • The Site Address names a different address than the one visitors use

    Sometimes

    The canonical link takes its host name from the Site Address setting, never from the request. If the site also answers at a second domain, or the setting says http behind a proxy that hides https from WordPress, every page names its twin at the other address as the original.

    Fix: Make the Site Address match the address the site is served at

  • The site's own links point at the copies

    Sometimes

    A link pasted into a menu or a page with its tracking parameter still attached makes the site link to the copy. Google's documentation asks that links within a site point at the canonical address.

    Fix: Change the site's own links that point at a copy

  • A sitemap lists the copies

    Rare

    WordPress's own sitemap lists each post's permalink and nothing else. An old sitemap file on the disk, or one made by another tool, can list addresses that carry a canonical link to somewhere else.

    Fix: Check that the sitemap lists canonical addresses only

How to fix it

Check that the listed addresses are copies, then leave them

  • Easy
  • No risk
  • About 10 minutes
  • Steps tested on WordPress 7.1.3
  1. Step 1: Open the reason in the report

    In the Page indexing report, click the row for this reason in the "Why pages aren't indexed" table. The page that opens has the table of examples.

  2. Step 2: Sort the addresses into two groups

    Most will be a page's address with something added or changed: a parameter, capital letters, /embed/. Set aside any that is the plain address of a page you want found.

  3. Step 3: Read the canonical link of any you are unsure of

    Use the command above or the page indexing check. If the link names the page you want in search, and that page loads, the address is a copy doing what it should. Leave it.

If nothing was set aside, you are done.

Find the code that points the canonical link at another page

  • Takes care
  • Back up first
  • About 20 minutes
  • Steps tested on WordPress 7.1.3

A page you want found is on the list, and its canonical link names a different page, such as the home page on every post. WordPress passes each canonical link through a filter named get_canonical_url, and code in a theme, a plugin or a must-use plugin can replace the address there. Google's page on canonical problems names the pattern: "Some content management systems (CMS) or CMS plugins can make incorrect use of canonicalization techniques to point to undesired URLs."

  1. Step 1: Read the page's own canonical link

    Run the command above on the page's plain address. A healthy post names itself.

  2. Step 2: Search the site's code for the filter

    From the site's main folder:

    Each line it prints is a file that uses the filter. If it prints nothing, no code under wp-content does: go to the next fix.

    bash
    grep -rl "get_canonical_url" wp-content/
  3. Step 3: Remove the file, or correct it

    A file in wp-content/mu-plugins is a must-use plugin. WordPress's documentation says these cannot be disabled from the dashboard, and that to disable one you remove its file. Download a copy first, then remove it, with the file's own name in place of file-name.php:

    Do not delete a file inside a plugin's or a theme's folder. Look for that plugin's canonical setting, which is the next fix, or ask whoever wrote the code.

    bash
    rm wp-content/mu-plugins/file-name.php
  4. Step 4: Read the link again

    The post should name its own address.

To undo it: Upload your copy of the file again.

Clear a canonical address typed into an SEO plugin

  • Easy
  • Low risk
  • About 10 minutes

Yoast SEO, by its own help page, adds canonical links to a site and gives each post, page, category and tag a field to change one: "Canonical URL", under "Advanced" in the Yoast SEO sidebar of the editor. It expects the full address. With another SEO plugin, look in its documentation for where a page's canonical address is set.

A value typed there is a fixed address. Check it on any page whose address has changed since, and on any page made as a copy of another, in case the copy kept the original's value.

  1. Step 1: Open the listed page in the editor

    Find the SEO plugin's canonical field for that page.

  2. Step 2: Empty the field, unless the address in it is one you chose

    The plugin then works the address out itself.

  3. Step 3: Update the page and read its canonical link again

    Use the command above on the page's plain address.

To undo it: Type the address back into the field.

Make the Site Address match the address the site is served at

  • Takes care
  • Back up first
  • About 15 minutes
  • Steps tested on WordPress 7.1.3

WordPress takes the host name of every canonical link from "Site Address (URL)", under Settings, then General, and never from the request. The link says https when that setting says https, or when WordPress sees the request itself arrive over https. It says http only when both say http.

Two setups make a page you want found name another address:

  • A second domain or host name. The site answers at two names with no redirect between them, and the Site Address holds the one you do not want. Every page at the other name calls itself a copy. WordPress redirects www against the bare domain by itself, so that pair does not cause this.
  • A Site Address left at http:// behind a CDN or proxy. The proxy takes the visitor's https connection and asks your server over plain http. WordPress sees http on both sides and names the http address.
  1. Step 1: Read the saved addresses

    home is the Site Address. Compare it with the address in your browser's bar: the same https and the same domain.

    bash
    wp option get home
    wp option get siteurl
  2. Step 2: Correct them

    Take a backup first. Replace https://example.com with the address the site is served at, with no slash at the end.

    bash
    wp option update home "https://example.com"
    wp option update siteurl "https://example.com"
  3. Step 3: Read a post's canonical link again

    It should begin with the address you set.

How to change your WordPress URL covers doing this without locking yourself out. Behind a proxy that asks your server over plain http, WordPress must also be told the visitor is on https, or the login page loops: see ERR_TOO_MANY_REDIRECTS. www vs non-www covers redirecting every other form of the address to the one you chose.

To undo it: Set the two old values again.

Check that the sitemap lists canonical addresses only

  • Easy
  • Low risk
  • About 10 minutes
  • Steps tested on WordPress 7.1.3

Google's documentation asks a site not to name "one URL in a sitemap, but a different URL for that same page using rel="canonical"". This prints the addresses a sitemap lists:

bash
curl -s "https://example.com/wp-sitemap-posts-post-1.xml" | grep -o '<loc>[^<]*</loc>'

WordPress's own sitemap lists each post at its permalink, with no parameters. A sitemap that lists an address with a parameter is not WordPress's own: it comes from another tool or from a file left on the disk.

  1. Step 1: Read the sitemap your site offers

    Use the address on the Sitemap: line of your /robots.txt in the command above. The sitemap WordPress makes explains which sitemap a site serves.

  2. Step 2: Set an old sitemap file aside

    A file named sitemap.xml in the site's main folder is served as it is, whatever it lists. From that folder:

    bash
    mv sitemap.xml sitemap.xml.old
  3. Step 3: Ask for /sitemap.xml again

    With no file in the way, WordPress redirects that address to its own sitemap.

To undo it: Rename sitemap.xml.old back to sitemap.xml.

When to get help

When pages you want found are on the list and you cannot see why. If such a page names another address as canonical and no field, setting or file on this page explains it, the canonical is being set somewhere else. Google also reads one sent as an HTTP header, which does not show in the page's source. Finding it takes the site's code, its server and the report side by side.

Common questions

Does "Alternate page with proper canonical tag" hurt my site?

Google's help says no action is needed, and that a page marked duplicate or alternate "is usually a good thing", because it means Google found the canonical page and indexed it. The page it kept is the one your own link named.

The number keeps going up. Is that a problem?

Not by itself. Every new form of an address that Google finds is one more, and the list is a sample of up to 1,000. What matters is whether a page you want found is among them. The first fix is that check.

How do I see which page Google indexed instead?

Inspect the listed address in Search Console and read "Google-selected canonical". By the status's definition it is the address your page names in its canonical link.

I corrected a wrong canonical link. When will the page be indexed?

No date can be given. Google reads the new link when it next crawls the page, treats it as a hint, and decides for itself. Its help says the count in the report changes as pages are crawled again, with or without a validation request.

More on this subject

Would you rather we fixed it?

SEO audit is $249. A written audit, each finding with its source, and up to 2 hours of fixes done and tested again. It starts with a free diagnosis.