Fixing Ecommerce SEO in WooCommerce
WooCommerce turns a WordPress site into a shop, and it inherits both the flexibility and the loose ends of WordPress. Out of the box it creates product tag pages, optional attribute archives, sorting and filter URLs, and its own Product markup, while your theme and SEO plugin add more of each.
None of that is wrong, but unmanaged it produces thin pages in the index, duplicated structured data and a slow shop. This guide walks through the WooCommerce settings and plugin choices that matter for search, in the order that makes the biggest difference.
- What WooCommerce creates that search engines can see
- Permalinks: choose once, then leave them alone
- Categories, tags and attributes
- Variations, filters, sorting and add-to-cart URLs
- Product markup: WooCommerce, the SEO plugin and the review plugin
- Why WooCommerce shops are often slow, and what helps
- The fix, step by step
- Edge cases worth knowing
- Questions and answers
What WooCommerce creates that search engines can see
Every WooCommerce shop generates a set of page types. Knowing which exist on your site is the first step, because each needs its own decision.
| Page type | Default address pattern | Usual decision |
|---|---|---|
| Product | /product/product-name/ | Index. Your most important pages. |
| Product category | /product-category/tents/ | Index, with a written introduction. |
| Product tag | /product-tag/lightweight/ | Usually noindex, unless a tag is a real, maintained landing page. |
| Attribute archive | /pa_colour/green/ (only if archives are enabled) | Leave disabled unless you will write and maintain these pages. |
| Shop page | /shop/ | Index, as the top of the catalogue. |
| Sorting and filtering | ?orderby=price, ?filter_colour=green | Keep out of the index; canonical to the unfiltered page. |
| Add to basket links | ?add-to-cart=123 | Block from crawling. |
| Basket, checkout, account | /basket/, /checkout/, /my-account/ | Noindex and leave out of sitemaps. |
A crawl of the shop, grouped by these patterns, shows at a glance which types have multiplied. Shops that were set up quickly often have more tag and filter URLs than products.
Permalinks: choose once, then leave them alone
Under Settings, Permalinks, WooCommerce offers product permalink options: the default
/product/ base, a shop base such as /shop/, a shop base including the category,
or a custom base. The same screen sets the category base (default product-category) and
tag base (default product-tag).
- Short and stable beats clever. The default
/product/name/works well. Including the category in product URLs looks tidy but means the address can change when a product moves category, and a product in several categories has to pick one. - Changing the base on a live shop changes every URL. WordPress redirects some old addresses on its own, but not reliably for every pattern. If you must change, map old to new addresses, add permanent redirects, update internal links and resubmit sitemaps.
- Removing the base altogether, so products sit at
/product-name/, needs an extra plugin and risks clashes with pages and posts of the same name. The gain for search is small.
Categories, tags and attributes
WooCommerce gives you three ways to group products, and shops often use all three for the same thing, creating near-identical pages.
- Categories are your main navigation: the ranges a shopper browses, such as Tents, Sleeping bags, Cooking. They deserve an introduction written in the category description field, which most themes show above or below the product grid.
- Tags are loose labels such as "lightweight" or "gift idea". Each tag gets its own archive page with no introduction and often only a few products. Unless you plan to maintain particular tags as landing pages, set tag archives to noindex in your SEO plugin and keep them out of the sitemap.
- Attributes, set under Products, Attributes, hold properties such as colour, size or material and power variations and filters. Each attribute has an "Enable archives?" option. When ticked, every attribute value gets a public page, such as all green products. That is useful only if you will write those pages; otherwise leave it off.
A fictional outdoor shop with a category "Tents", a tag "tents" and an attribute archive "Type: Tent" has three pages competing for the same search. Pick the category, and redirect or noindex the others.
Variations, filters, sorting and add-to-cart URLs
Variable products
A variable product in WooCommerce has one page and one URL, with each size or colour selected on the
page. Links can preselect a variation with parameters such as ?attribute_pa_colour=green.
WordPress's canonical tag points to the clean product address, which keeps these out of the index. If
a separate page for one colour would genuinely answer a search people make, that is a decision for a
separate simple product or a landing page, not for variation parameters. The trade-offs are explained
in Fixing product variants.
Filter and sort parameters
The classic layered navigation widgets and the newer product filter blocks add parameters such as
filter_colour, query_type_colour, min_price and max_price,
and the sorting menu adds orderby. Combined, they can create thousands of URLs for one category.
Check that these pages carry a canonical tag pointing at the unfiltered category or a noindex, and consider
disallowing the heaviest combinations in robots.txt. The full approach is in Fixing
faceted navigation, and the crawl side in Fixing
WooCommerce crawl issues.
Add to basket links
Product grids link to ?add-to-cart= addresses so that one click adds an item. WooCommerce
marks these links nofollow, but crawlers still find and request them, which wastes crawling and can create
empty sessions. A robots.txt rule stops it:
User-agent: *
Disallow: /*add-to-cart=*
Disallow: /*?orderby=*
Only add the orderby line if sorting URLs are not already handled by canonical tags,
and never block the product, category or image addresses themselves.
Product markup: WooCommerce, the SEO plugin and the review plugin
WooCommerce outputs Product structured data on product pages by itself, including price, stock and, when reviews are enabled, the rating and recent reviews. Yoast SEO with its WooCommerce add-on and Rank Math can replace that with their own Product markup inside their site-wide graph. Separate review plugins and some themes add more.
The audit often finds two or three Product blocks on one page, sometimes with different prices or ratings. Decide on one owner:
- If you use an SEO plugin's WooCommerce integration, let it own the Product and confirm it removes or merges WooCommerce's own block.
- If not, leave WooCommerce's built-in markup and switch off Product output in the theme and any schema plugin.
- Check review plugins separately; many have an option to add their own rating markup that should be off if another source already includes reviews.
Then confirm that price, currency and stock in the markup match the page, including sale prices and VAT display. Field-level errors are covered in Fixing Product schema errors and review markup in Fixing review schema.
Why WooCommerce shops are often slow, and what helps
Unlike a hosted platform, a WooCommerce shop's speed depends on your hosting and your plugin choices. The common causes:
- Slow server response. Every uncached page is built by PHP and database queries. An up-to-date PHP version, a persistent object cache such as Redis where the host offers it, and adequate server resources make a visible difference.
- Page caching that skips the shop. Basket, checkout and account pages must not be cached, but product and category pages usually can be for visitors without items in their basket. Check your caching plugin or host follows WooCommerce's cookies correctly rather than excluding the whole shop.
- The cart fragments script. It keeps mini-basket counts up to date with an extra request. Since version 7.8, WooCommerce no longer loads it on every page by default, but themes and mini-basket widgets often load it again, sometimes on every page of the site.
- Plugins loading everywhere. Sliders, zoom, form and wishlist plugins often load their assets on every page. An asset manager plugin can restrict them to the pages that need them.
- Image sizes. The product image sizes set under Appearance, Customise, WooCommerce, Product images should match your theme's layout; after changing them, regenerate thumbnails so old sizes are replaced.
Product-template specifics such as the gallery and app scripts are covered in Fixing product page speed.
The fix, step by step
Step 1
Settle your product and category URLs
Open Settings, Permalinks and note the product permalink option, category base and tag base in use. If the shop is live and ranking, keep the current structure unless there is a strong reason to change. If you do change it, export every product and category URL first, set permanent redirects from each old address to its new one, update menus and internal links, and resubmit your sitemap in Search Console.
Step 2
Decide what categories and tags are for
Make categories your browsing structure and write an introduction in each main category's description field. Review product tags: keep only those you will maintain as proper landing pages, and in your SEO plugin set tag archives to noindex and exclude them from the sitemap. Where a tag duplicates a category, remove the tag from products and redirect its archive to the matching category so the two stop competing.
Step 3
Control attribute archives and filter URLs
Under Products, Attributes, edit each attribute and untick "Enable
archives?" unless you will write those pages. Crawl a category with filters applied and check that URLs
containing filter_, min_price or orderby carry a canonical to
the clean category or a noindex. Add robots.txt rules for add-to-cart= links, and for sorting
parameters if needed, without blocking products, categories or product images, which search engines must
still be able to fetch.
Step 4
Keep variations on one product page
Check a variable product with variation parameters in the address, such as ?attribute_pa_colour=green,
and confirm the canonical tag points to the clean product URL. Give each variation its own image, SKU,
price and stock so the page updates properly when a shopper chooses it. Only create a separate product
for a variant when people search for it by name and it differs enough to deserve its own description.
Step 5
Leave one source of Product markup
View
the source of a product page and count the "@type": "Product" blocks. Decide whether WooCommerce
itself or your SEO plugin's WooCommerce integration owns the Product markup, then switch off Product
and rating output in the theme, schema plugins and review plugins. Test the page in the Rich Results
Test and confirm price, currency, stock and rating match what the page shows, including sale prices and
VAT.
Step 6
Fix the product and shop page templates
Check
that the product name is the page's only <h1>, that the SEO title pattern in your
plugin puts the product name first rather than the shop name, and that the short description beside the
price is your own text. Edit the Shop page in your SEO plugin to give it a proper title and description.
Turn on reviews, and consider limiting them to verified owners under WooCommerce, Settings, Products.
Step 7
Speed up hosting, images and scripts
Check server response time for an uncached product page in PageSpeed Insights, and ask your host about PHP version, object caching and page caching that respects WooCommerce cookies. Find out whether cart fragments loads on every page and restrict it if your theme does not need it everywhere. Limit heavy plugin assets to the pages that use them, and match product image sizes to your theme, regenerating thumbnails afterwards.
Step 8
Check sitemaps and Search Console
Open
your sitemap index, either WordPress's /wp-sitemap.xml or your SEO plugin's, and confirm
it lists products and categories but not tags you set to noindex, attribute archives or basket and checkout
pages. Submit it in Search Console. Over the following weeks, use the Pages report to watch filter, tag
and add-to-cart URLs leave the index, and rerun the Ecommerce Audit on your top products.
Edge cases worth knowing
- Out-of-stock items. The setting under WooCommerce, Settings, Products, Inventory to hide out-of-stock items removes them from shop and category grids, but their product pages stay live. That is usually right for items coming back; for discontinued lines, redirect the page to the closest replacement or category.
- Products in several categories. Breadcrumbs and category-based URLs use one category. Yoast and Rank Math let you set a primary category per product so the choice is deliberate.
- Multilingual and multi-currency plugins. These create further URL sets. Check that hreflang, canonicals and currency in the Product markup match each version.
- Block themes. Newer WooCommerce block templates change where titles, descriptions and breadcrumbs are output. After switching theme, recheck headings and structured data rather than assuming they carried over.
1. Which WooCommerce product permalink setting is best for SEO?
For most shops the default /product/product-name/ structure is fine and the safest choice. It is short, stable and does not change when you move a product between categories. Including the category in the product URL looks neat but ties the address to a category decision, and products in several categories can only show one. The more important rule is to avoid changing the structure on an established shop without mapping and redirecting every old address.
2. Should WooCommerce product tag pages be indexed?
In most shops, no. Tag archives usually have no introduction, contain only a handful of products and overlap with categories, so they add thin pages to the index without helping shoppers. Set them to noindex in your SEO plugin and keep them out of the sitemap. The exception is a tag you deliberately maintain as a landing page, such as a curated gift range, with its own written introduction and regular updates, which can deserve to be indexed.
3. Do I need Yoast WooCommerce SEO or a similar premium add-on?
Not necessarily. WooCommerce already outputs Product markup, and the free versions of the main SEO plugins handle titles, sitemaps and noindex settings. Premium WooCommerce add-ons mainly integrate Product markup into the plugin graph, add fields such as brand and GTIN, and improve breadcrumbs. They can be worth it for larger catalogues, but whichever you use, check the result has one Product block per page and that the data matches the page.
4. Why does my WooCommerce product have two Product schema blocks?
Usually because WooCommerce outputs its own Product markup while an SEO plugin, a theme or a review plugin adds another. Search engines then see two descriptions of the same product, sometimes with different prices or ratings. Pick one source, normally either WooCommerce itself or your SEO plugin integration, and switch off Product and rating output everywhere else. Then test the page again in the Rich Results Test to confirm only one complete block remains.
5. Should each WooCommerce variation have its own URL?
Generally not. A variable product works best as one page where shoppers pick size or colour, with the canonical pointing to the main product URL, which is how WooCommerce and WordPress behave by default. A separate page only makes sense when people search for that exact variant by name and it differs meaningfully, for example a distinct model rather than a size. In that case make it a separate product with its own description rather than relying on variation parameters.
6. Is cart fragments still a problem in WooCommerce?
Less than it was. Since WooCommerce 7.8, the cart fragments script is no longer loaded on every page by default. However, many themes and mini-basket widgets load it again because they need live basket counts, sometimes across the whole site including blog posts. Check your pages with browser developer tools for the wc-ajax get_refreshed_fragments request. If it appears where no basket is shown, restrict it using your theme settings or a performance plugin that lets you control it.
7. How do I stop filtered category URLs being indexed?
Make sure filtered and sorted category pages carry a canonical tag pointing to the clean category, or a noindex, which most SEO plugins handle for common WooCommerce parameters. Check a few with view source to confirm. If crawlers still spend a lot of time on them, add robots.txt rules for the worst parameter combinations, but only after the canonical or noindex is in place for pages already indexed, because blocked pages cannot have their noindex read.
The Ecommerce Audit checks your most important store pages for product page completeness, category depth, Product and review schema, faceted navigation, product images, internal links and product page speed.
Open Ecommerce Audit Fixes โ