Duplicate canonical URLs in WooCommerce

CatalogLift finds products that declare the same canonical URL. Compare those products before changing the setting: a shared address can be appropriate, while a copied setting can point a distinct product at the wrong page.

Content & SEO Medium severity Detection + evidence

A canonical expresses a preference

Google treats rel="canonical" as a strong signal when choosing a representative URL for duplicate or very similar pages. It can select a different URL. A shared field therefore does not prove that a product has disappeared from search.

Review the intended relationship between the pages. Keep a deliberate consolidation of equivalent content; correct an accidental reference to an unrelated product. See Google’s canonicalization guidance.

How to find duplicate canonical URLs manually

The canonical lives in postmeta under a key set by your SEO plugin. With Yoast SEO, this WP-CLI query lists every canonical URL that more than one published product declares:

wp db query "SELECT pm.meta_value AS canonical, COUNT(*) AS uses,
       GROUP_CONCAT(p.ID) AS product_ids
FROM wp_postmeta pm
JOIN wp_posts p ON p.ID = pm.post_id
WHERE pm.meta_key = '_yoast_wpseo_canonical'
  AND pm.meta_value <> ''
  AND p.post_type = 'product' AND p.post_status = 'publish'
GROUP BY pm.meta_value
HAVING uses > 1
ORDER BY uses DESC;"

Rank Math stores it under rank_math_canonical_url. Adjust the table prefix if yours isn't wp_.

This groups stored values according to your database collation; it does not normalize URLs as addresses. Case and trailing-space comparisons depend on the database settings. It only knows one plugin's meta key, and a later import can introduce new matches.

How CatalogLift finds it

Scans compare explicit literal URLs on published products. They normalize scheme and host case, omit default ports and fragments, and trim surrounding whitespace. Path case and query parameters remain significant. Empty values and SEO template variables are skipped.

Each finding records the shared URL, group size and a bounded sample of products. Available sample members link to records in the same store. If the setting is wrong, change it in the SEO plugin and use “I fixed it — check now”. CatalogLift confirms the catalog change; it does not verify Google’s selected canonical or search visibility.

Fair questions, straight answers.

What does a shared canonical URL mean?

Several products declare the same preferred URL. That can be intentional for duplicate or very similar pages, or an accidental setting copied to an unrelated product.

Does Google always follow the declared canonical?

No. The declaration is a strong signal, not a guarantee. Google can choose another canonical. This catalog check does not inspect Google's indexing decision.

Does CatalogLift change canonicals?

No. If the setting is wrong, change it in your SEO plugin in WooCommerce and ask CatalogLift to check the result. If the shared address is intentional, keep it and dismiss the finding with a reason.

What if no canonical is explicitly set?

This check skips empty fields and template placeholders. It compares only explicit literal canonical URLs reported by the supported SEO plugin; it is not a crawl of rendered storefront tags.

See it on your own catalog.

Create a free account, connect your WooCommerce store and this check runs on your real products, along with the rest.

No card required. The free plan never writes to WooCommerce.