WooCommerce SEO: The Complete Guide to Product and Category Pages

by Francis Rozange | Oct 2, 2026 | SEO, WooCommerce

In 2025, nearly half of the crawl problems reported to the Google team in charge of its crawler came from sites’ filter navigation. Nearly a quarter came from action links, such as add-to-cart buttons. And for one of those links, Google’s team ended up opening an issue in WooCommerce’s code repository itself.

SEO for a WooCommerce store does not look like SEO for a blog. You have to describe products to Google, feed Merchant Center, manage variations, filters, stock-outs and categories, without letting the crawler get lost in thousands of useless addresses.

This guide relies on Google’s documentation and on what WooCommerce 11.1 really does, checked in its code in October 2026. It covers structured data, Merchant Center and free listings, variations, faceted navigation, stock-outs, category pages, product pages and internal linking. It also tells how Google and WooCommerce fixed a crawl waste problem together in eight days.

What Google reads on a WooCommerce store

Product snippets and merchant listings

Google distinguishes two uses of product markup. Product snippets cover pages where people cannot buy directly, such as a comparison or a review. Merchant listings cover pages where the customer can buy: as is every product page in a store.

Only pages that allow a purchase are eligible for merchant listings, with a price greater than zero. Category pages are not: product rich results only concern pages devoted to a single product, or to variants of the same product.

Structured data, a Merchant Center feed, or both

Google reads products in two ways: through the pages’ structured data, and through a feed sent to Merchant Center. Its documentation recommends both, which maximize eligibility for the various displays and help it verify the data. Since 2022, a store can appear in Search’s merchant listings without a Merchant Center account. The Shopping tab, on the other hand, requires that account.

For Search’s artificial intelligence features, Google states that no special markup is needed, and that Merchant Center feeds help products be visible there.

Product structured data: what WooCommerce does on its own

What core already prints

WooCommerce itself produces Product JSON-LD markup on every product page: name, address, description, main image, SKU, price, availability, reviews and average rating. The GTIN, EAN or ISBN code has had a dedicated field since version 9.2 and has been part of the markup since 9.3. The brand is added through brand management, built into core since version 9.6.

A few details matter. The description used is the short description if there is one, otherwise the long description. Only the main image appears in the markup. For a simple product on sale, WooCommerce gives the sale price and marks the regular price as a list price, a value Google still accepts during a transition period.

What is missing: shipping, returns, condition, variants

In version 11.1.2, core markup contains no shipping costs, no return policy, no item condition and no variant group. Search Console warnings about those fields are therefore expected. A store-level return policy markup exists in WooCommerce’s development branch, planned for a future release, but it is not published yet.

An SEO plugin can complete or replace this markup. The golden rule remains having a single source of product markup, to avoid two contradictory graphs. Our comparison of the best WordPress SEO plugins details what each one does for WooCommerce.

Declaring shipping and returns once for the whole site

Google no longer asks you to repeat shipping and returns on each product. It recommends declaring a global return policy at the organization level, and offers the same approach for shipping. Since November 2025, Search Console’s shipping and returns setting has been open to every site Google identifies as a merchant, and it takes precedence over the site’s structured data.

For those who prefer markup, the minimal form looks like Google’s example below, with values to replace by the store’s real policy.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "OnlineStore",
  "hasMerchantReturnPolicy": {
    "@type": "MerchantReturnPolicy",
    "applicableCountry": ["FR", "BE"],
    "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
    "merchantReturnDays": 30,
    "returnMethod": "https://schema.org/ReturnByMail",
    "returnFees": "https://schema.org/FreeReturn"
  }
}
</script>

Checking the result

Google’s Rich Results Test shows what the crawler reads on a product page. In Search Console, the reports devoted to merchant listings and product snippets list errors and warnings site-wide. A warning on an optional field does not prevent display; an error on a required field does.

Merchant Center and free listings

What free listings are, and what they exclude

Since April 2020, Google has shown merchants’ products for free in the Shopping tab, then in Search, Images, YouTube and other surfaces. These free listings only feature product pages, never the home page, shipping terms or category pages.

They are on by default in most cases, but Google warns that this permission does not guarantee display. A return policy visible on the site and shipping settings are among the requirements.

Google for WooCommerce and the end of the Content API

The free plugin WooCommerce publishes with Google, formerly called Google Listings & Ads, has been named Google for WooCommerce since July 2024. It syncs products with Merchant Center without a feed file to maintain, and has more than 800,000 active installations as of October 2026.

The Content API for Shopping, Merchant Center’s legacy API, reached its sunset on August 18, 2026, with a full shutdown planned for early 2027. Google for WooCommerce has used the new Merchant API since its version 3.8.0, released in July 2026. If you run an older version, update it without waiting.

The consistency rule between page, markup and feed

Merchant Center requires consistent availability across the product page, the structured data, the checkout page and the feed. A mismatch leads to the product being disapproved. The same logic applies to price: a feed price that does not match the price Google reads on the landing page or at checkout triggers a price mismatch disapproval.

Feed descriptions also follow precise rules: no promotional text, no links, no capitals for emphasis, and the essential information in the first characters. Text written by artificial intelligence must be declared as such in a dedicated attribute.

Variations and parameters: WooCommerce’s own duplicate content

Variation addresses and the canonical tag

A variation is preselected through an address parameter, such as ?attribute_pa_size=large. Google recommends exactly this model for sites where all variants live on a single page: one canonical address for the group, and each variant reachable through a parameter.

WordPress produces the canonical tag of single pages without parameters, so variation addresses point to the main product page. Archive pages, however, such as categories, tags, the shop and filtered pages, receive no canonical tag from core: that is one of the things an SEO plugin brings. Google also points out that some duplicate content is normal and violates none of its rules.

Categories in permalinks

With a product base that includes the category, the same product can appear under several addresses. Since version 9.5, WooCommerce redirects an address with the wrong category to the product’s canonical address. Since 10.5, it picks the deepest category in the hierarchy, and automatically redirects old addresses with a 301.

Nearly five years to fix a variation’s price

An issue opened in September 2021 described a problem merchants knew well. On a variation’s address, WooCommerce showed the parent product’s price range in the markup. Google read the lowest price, Merchant Center saw a mismatch with the variation price sent in the feed, and disapproved the product.

The fix arrived with WooCommerce 11.0, in August 2026, in a release devoted to clearing the backlog of old issues. When every attribute is in the address and points to a single variation, the markup now contains a single offer, at the variation’s exact price.

Faceted navigation: what Google has asked since December 2024

Block or optimize

In December 2024, Gary Illyes, an analyst at Google, published a post and documentation on faceted navigation, the price, color, size or brand filters that multiply addresses. Google describes it as by far the most common source of overcrawling reported by site owners.

Google offers two paths. If filtered pages do not need to be indexed, block their crawling in robots.txt, or use URL fragments, which the crawler ignores. If they need to be crawled, use the & separator, keep a stable filter order and return a 404 error when a combination yields no results. Canonical and nofollow tags are considered less effective in the long term.

WooCommerce’s filter block parameters

WooCommerce’s product filters block uses parameters such as min_price, max_price, rating_filter, filter_stock_status, and filter_ followed by the attribute name. Classic sorting goes through orderby. WooCommerce blocks none of these parameters in its robots.txt: the decision belongs to each store.

A robots.txt for filters

For a store that does not want its filtered pages crawled, an example built on Google’s syntax and WooCommerce’s parameter names looks like this. It is not an official recommendation: test it on your own site before applying it.

User-agent: *
Disallow: /*?*filter_
Disallow: /*?*query_type_
Disallow: /*?*min_price=
Disallow: /*?*max_price=
Disallow: /*?*rating_filter=
Disallow: /*?*orderby=

The block also uses categories, tags and brands for category, tag and brand filters. These generic names may be used by other plugins, so check them before blocking them.

A classic trap lurks here. Robots.txt controls crawling, not indexing: a blocked address can stay in the index. If filtered pages are already indexed, add a noindex tag first, wait for them to drop out, then block. Google cannot read a noindex on a page it is not allowed to crawl.

A maze of light paths where most fade out and one continues

The real case: when Google opened an issue at WooCommerce

This story is documented by WooCommerce’s code repository, by Google Search’s official podcast and by Search Engine Journal. It shows that a crawl problem can come from the platform itself, and that an upstream fix can relieve every store that updates, all at once.

Buttons that double the addresses

On a classic theme, the add-to-cart button in product lists is a link to an address such as ?add-to-cart=123, with a nofollow attribute. Every product in every category thus exposes an action address the crawler can follow. Block themes mostly use a button with no address, but not in every case.

In June 2024, Gary Illyes had already publicly asked sites to block add-to-cart and wishlist addresses, useless for crawlers. In July 2025, a merchant had opened an issue at WooCommerce on the same subject. It was closed as not planned two days later, the maintainer replying that the requested setting would not be built, as a contributor had pointed out, and noting that the text looked AI-generated and unvalidated.

The September 8, 2025 issue

On September 8, 2025, Gary Illyes himself opened an issue in WooCommerce’s repository. His observation was brief: crawlers keep crawling WooCommerce’s action URLs, useless for them and for site owners alike, and the parameter-less address is the canonical one anyway. He proposed a robots.txt rule and judged that potentially every WooCommerce site was affected.

Four days later, a WooCommerce developer opened a pull request. The discussion covered the exact form of the rule, and the final version adds two, to also cover the parameter when it is not in first position. On September 16, eight days after the report, the change was merged. It shipped with WooCommerce 10.3, in October 2025.

What Google said about it

On February 3, 2026, in a Search Off the Record episode devoted to the year in review, Gary Illyes and Martin Splitt went back over the reports received. Faceted navigation accounted for nearly half of the validated problems, action parameters nearly a quarter. A single add-to-cart parameter, Gary Illyes explained, is enough to double a site’s URL space.

He described how the team traced these parameters back to WordPress plugins, and opened issues where their code was public. WooCommerce picked up the problem almost immediately and solved it. The issue opened with another plugin, not named, was still waiting. Search Engine Journal reported the episode the same day.

The follow-ups, and what to check

The two add-to-cart lines have not changed since 10.3. The other lines WooCommerce adds to robots.txt, those for its log and downloadable-file folders, were fixed later: 10.7 for sites installed in a subfolder, 11.1 for installs that move the wp-content folder or the uploads. On a standard install running 11.1.2, WordPress’s virtual robots.txt should contain these lines.

User-agent: *
Disallow: /wp-content/uploads/wc-logs/
Disallow: /wp-content/uploads/woocommerce_transient_files/
Disallow: /wp-content/uploads/woocommerce_uploads/
Disallow: /*?add-to-cart=
Disallow: /*?*add-to-cart=
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php

Three lessons emerge. The nofollow attribute on the buttons was not enough to stop crawling. The rule only lives in WordPress’s virtual robots.txt: a physical robots.txt file at the site root replaces it, and the rule is then absent. Finally, WooCommerce only dealt with action addresses: filters, close to half of the reports Google received, remain your responsibility.

Open your store’s /robots.txt address and look for the two add-to-cart lines. Search Console’s crawl stats report then shows how the crawler spreads its requests, although Google aims it at advanced users and says a site with fewer than a thousand pages should not need it.

Stock-outs and discontinued products

Temporary stock-out: keep the page

Google is explicit: an out-of-stock product should not go through Search Console’s removals tool. Better to keep the page online and mark it as unavailable. WooCommerce’s markup handles three states: in stock, on backorder and out of stock.

In 2022, Google’s John Mueller explained that a page that only announces a stock-out may be treated like a soft 404, while a page rich in product information can stay relevant. An out-of-stock product page therefore keeps all its content, its reviews and its links to similar products.

Discontinued product: redirect or remove

A product discontinued for good follows another rule. If it has a successor or a close equivalent, a permanent 301 redirect passes its address on. If it has no replacement, a 404 or 410 error is the correct response, and Google treats both codes the same way. In Merchant Center, a discontinued product is removed from the feed instead of being marked out of stock.

The setting that hides out-of-stock products

WooCommerce’s inventory settings offer to hide out-of-stock products from the catalog. According to its code, this setting only removes them from product lists: their address stays reachable. A hidden product therefore loses its links from categories while staying indexable, which weakens its page without removing it from Google.

Category pages: a little content, many links

A hierarchy Google can follow

Google recommends a simple structure: links from menus to categories, from categories to subcategories, then to every product. Best sellers can also receive links from the home page or articles. When not everything can be linked, a sitemap or a Merchant Center feed takes over.

Category text

In 2021, John Mueller explained that a page needs enough information for Google to understand its topic, and that extra text mostly helps when product names are not self-explanatory. One to three sentences of context at the top of the category are often enough, in his words, with no wall of text written for the crawler. In WooCommerce’s classic templates, the category description only shows on the archive’s first page.

Pagination and empty categories

For pagination, Google asks for a unique address per page, a canonical tag specific to each page, and standard links between them. Do not point later pages to the first as the canonical version, and know that Google no longer uses previous and next page tags. These lists’ performance matters too: our guide to WordPress Core Web Vitals fixes covers the levers.

An empty category should get a noindex tag. If it disappears from navigation, Google suggests considering a 404 error.

Product pages: descriptions and images

Descriptions written for the customer

WooCommerce’s short description serves as the description in the markup, which is reason enough to polish it. Text generated by artificial intelligence is not banned, but Google points out that mass-producing pages without value for users can fall under its scaled content abuse policy. A product page copied word for word from the manufacturer adds nothing that other resellers do not already offer.

Images Google can read

Google does not index images set in CSS: they must be real image tags, with a descriptive file name and alt text. For merchant listings, Google recommends several images of at least 50,000 pixels each. Merchant Center will require a minimum of 500 by 500 pixels from January 31, 2027, and recommends 1,500 by 1,500.

By default, WooCommerce shows the main image 600 pixels wide, and catalog thumbnails at 300 pixels. Since version 11.1, per-variation image galleries are available in every store. Our comparison of the best image optimization plugins helps lighten these files without visible loss.

Internal linking and breadcrumbs

Links the crawler can follow

Google only follows links written as an <a> tag with an href attribute. Every important page should receive at least one link from another page on the site, with descriptive anchor text. WooCommerce’s related products, upsells and cross-sells naturally create these links between product pages.

Since version 11.1, WooCommerce removes the nofollow attribute from product buttons that simply lead to the product page, while keeping it on add-to-cart links and links to external products.

WooCommerce’s breadcrumbs and core’s

WooCommerce’s breadcrumbs, in the classic version as well as the block, produce BreadcrumbList markup. The Breadcrumbs block added to core with WordPress 7.0 produces none. Replacing WooCommerce’s block with core’s therefore removes that markup, unless an SEO plugin provides it. Since January 2025, Google has only shown this rich result on desktop.

Summary table

Topic What Google says What WooCommerce 11.1 does Action
Product markup Merchant listings on purchase pages Product with price, GTIN, brand, reviews A single markup source
Shipping and returns Organization level or Search Console Missing from the markup Search Console setting or global markup
Merchant Center Free listings, product pages only Google for WooCommerce, Merchant API Latest version, at least 3.8.1
Filters Block or structure No blocking Decide and write the robots.txt
Add to cart Block action addresses Blocked since 10.3 Check the served robots.txt
Stock-out Keep the page, mark it out of stock Availability in the markup Rich page, similar products
Discontinued product 301 if equivalent, otherwise 404 or 410 No automatic handling Redirect, remove from feed
Breadcrumbs Typical user path Marked up by WooCommerce, not by core Keep WooCommerce’s block

Frequently asked questions

Do I need a Merchant Center account?

Not to appear in Search’s merchant listings, which can rely on structured data. It is, however, required for the Shopping tab and free listings, and Google recommends combining both sources.

Should filtered pages be indexed?

Rarely. A filter combination that matches a real search, such as a color within a category, may deserve a dedicated page. The others are better blocked in robots.txt, after they drop out of the index if they are already in it.

What should I do with a permanently discontinued product?

A 301 redirect to its successor or the closest product if there is one, otherwise a 404 or 410 error. Remove it from the Merchant Center feed as well.

Does WooCommerce handle structured data on its own?

Largely. Core produces solid Product markup, but without shipping, returns, condition or variant group. Search Console and an SEO plugin fill in what is missing.

Is WooCommerce’s robots.txt enough?

It blocks add-to-cart addresses since version 10.3, provided no physical robots.txt file replaces it. It blocks no filter and no sorting.

How much text on a category page?

Enough for the topic to be clear, often one to three sentences. A long text written for the crawler does not help the customer, who comes looking for products.

Conclusion

SEO for a WooCommerce store comes down to a few decisions: a single source of product markup, shipping and returns declared once, an up-to-date Merchant Center feed, controlled filters, stock-outs handled without deleting pages, and categories that tie everything together. WooCommerce already does part of the work, and Google documents the rest precisely.

The story of Google’s issue is also a reminder that an up-to-date store benefits from fixes it never asked for. SEO does not stop at the product page: a fast, clear checkout then turns those visits into sales, as our guide to WooCommerce checkout optimization shows.

Sources


LaFactory designs, builds and maintains WordPress and WooCommerce sites, and develops its own plugins. Talk to us about your WordPress project.

Francis Rozange

Former section editor at Libération, he runs LaFactory, an international web agency since 1996.

Cart