Canonical Tags in Shopify
How Shopify auto-generates canonicals, the collection-versus-product URL behavior, and how to customize the tag in theme.liquid.
WooCommerce leaves canonical handling to WordPress core and your SEO plugin, and filter, sort, and pagination URLs are where that gap shows.
No, and WooCommerce doesn't try to hide that fact. WooCommerce is a plugin layered on top of WordPress, and it does not implement its own rel=canonical system. Whatever canonical tag appears on a WooCommerce page comes from one of two sources underneath it.
The first is WordPress core, which outputs a self-referencing canonical tag on singular content, and because WooCommerce products are registered as a custom post type, a single product page such as /product/blue-shirt/ gets a self-referencing canonical from core even on a store running no SEO plugin at all. The second source is whatever SEO plugin is active, Rank Math, AIOSEO, Yoast, or similar, which takes over and normalizes canonical output, extends it to shop and product-category or tag archive pages, handles pagination, and provides per-item overrides.
As one industry reference puts it, WooCommerce and WordPress automatically add self-referencing canonicals to most pages, but the defaults fail in complex scenarios. That's the key tension on a WooCommerce store: the core pages are fine out of the box, but the moment customers start filtering, sorting, and paginating a catalog, the base install has no answer at all. WooCommerce does not, by default, implement any canonical tags on filtered URLs, any noindex directives, or any robots.txt rules to prevent crawling them, that job falls entirely to your SEO plugin or a developer.
On a typical WooCommerce store, the pages that matter most canonicalize cleanly. A single product page carries a self-referencing canonical supplied by core and reinforced by the active SEO plugin. The shop page itself, along with product category and product tag archive pages, get a self-referencing canonical from the SEO plugin layer, and in modern setups each paginated archive page, such as /category/mens/page/2/, self-references its own URL rather than collapsing back to page 1.
Product variations need a bit more care. When a product has variations exposed through query strings, such as ?attribute_pa_color=blue on a variable product, best practice is for that variation URL to canonicalize to the parent variable product page, /product/name-of-product/, rather than being treated as a standalone indexable URL. That keeps ranking signals consolidated on the one URL that actually represents the product family, instead of splitting them across every color and size combination a shopper might select.
None of this happens automatically from WooCommerce alone; it's the combination of WordPress core's baseline behavior and whatever SEO plugin is doing the heavier lifting that produces this result.
Where WooCommerce stores run into real trouble is the sheer number of URL variations a catalog can generate once shoppers start interacting with it. None of these are pages in the traditional sense, they're the same product listing, reshuffled or filtered, addressed by a different query string each time.
Sorting is one source: ?orderby=price, ?orderby=popularity, ?orderby=date, ?orderby=rating, and similar parameters all return the same set of products in a different order, which search engines see as duplicate content under different URLs. Pagination adds another layer, including the AJAX-driven ?product-page=2 parameter alongside the standard /page/2/ pattern. Layered navigation and filter widgets are the biggest multiplier: ?filter_color=blue, ?filter_pa_size=42, min_price and max_price sliders, and every combination shoppers can select by stacking multiple filters at once.
The scale compounds fast. A store with 100 products and 10 filter options can create thousands of potential URLs, and a catalog with around four filter attributes and roughly ten options each can generate more than 10,000 unique URL permutations, before sort parameters are even added on top. Every one of those URLs is, by default, fully crawlable and indexable, because WooCommerce ships no canonical, noindex, or robots.txt handling for any of them. The result is index bloat: search engines spending crawl budget on thousands of near-identical parameter URLs instead of the actual products and category pages that matter.
The standard fix is a tiered strategy that combines canonical tags, noindex, and crawl blocking, rather than relying on any single signal, because canonical is a hint, not a directive, and a filtered URL that stays crawlable and internally linked can still get crawled and indexed regardless of what its canonical tag says.
For pure noise, sort parameters, pagination parameters, and price-range sliders like orderby, product-page, and min_price or max_price, the strongest fix is blocking crawling outright, often through robots.txt disallow rules, paired with noindex where the URLs are still reachable through internal links:
Disallow: /*?orderby=
Disallow: /*?sort=
Disallow: /*min_price=
Disallow: /*max_price=For navigational multi-facet combinations, a shopper stacking three or four filters at once, the recommended approach is a noindex meta tag combined with a canonical pointing back to the parent, unfiltered category page. That tells search engines the combination itself isn't worth indexing, while still crediting the main category for the ranking signals.
For commercially valuable single facets, a brand filter or a material filter with genuine search demand behind it, for example a URL like /category/mens-shoes/?filter_brand=nike, the better move is to keep that URL indexable with its own self-referencing canonical, ideally backed by some unique supporting content, rather than noindexing away a page people are actually searching for.
Pagination should self-reference at every tier: each paginated page holds different products and deserves its own chance at being crawled and indexed, so canonicalizing every paginated page back to page 1 is discouraged, even though some SEO plugins offer that as an option.
Most WooCommerce canonical problems come down to treating the platform as if it handles this automatically.
No. WooCommerce does not, by default, implement any canonical tags, noindex directives, or robots.txt rules on filtered or sorted URLs. That protection has to come from an active SEO plugin or manual developer work.
No, the recommended practice is for a variation URL, such as one built with an attribute query string, to canonicalize to the parent variable product page rather than being treated as its own indexable URL.
A robots.txt disallow rule prevents crawling in the first place; a canonical tag is a hint evaluated only after a page is crawled, telling search engines which URL should get credit. Because canonical is a hint and not a directive, a crawlable filter URL can still be indexed despite its canonical tag, which is why the noisiest parameters are usually blocked from crawling rather than left to a canonical alone.
No. Each paginated page typically holds different products and deserves its own chance to be crawled and indexed, so self-referencing canonicals on pagination are recommended over collapsing everything back to page 1, even though some SEO plugins offer that as a configurable option.
That's discouraged. Running two SEO plugins, such as Rank Math and AIOSEO or Yoast together, can emit conflicting or duplicate canonical tags on the same page, which confuses rather than helps search engines.
How Shopify auto-generates canonicals, the collection-versus-product URL behavior, and how to customize the tag in theme.liquid.
How to switch on canonical tags for Magento products and categories, and why the built-in setting does not fix layered navigation.
BigCommerce adds self-referencing canonicals automatically and folds a product's multiple category URLs to one canonical product URL.