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.