Skip to main content

WooCommerce SEO: Permalinks, Schema and Product Data That Rank

WooCommerce SEO for product catalogs: permalink bases, attribute filters, variable products, Yoast or Rank Math schema and the fields that rank.

WooCommerce SEO: Permalinks, Schema and Product Data That Rank

WooCommerce SEO is the work of getting a WooCommerce store's product and category pages to rank in search. Because WooCommerce runs on WordPress, part of it is WordPress setup: indexing, sitemaps and an SEO plugin. The rest is specific to WooCommerce: the product permalink base, category and tag bases, attribute archives and filters, variable products, Product structured data and the product fields every page is built from.

The short version: choose a stable product permalink base before the catalog grows, keep thin tag and attribute archives out of the index, build filters on global attributes, give every variation its own SKU and GTIN, make sure exactly one plugin prints Product schema, and fill the fields a product page renders. This guide walks through each step with the real WooCommerce settings and field names. For the audit process that comes before it, see our ecommerce SEO audit checklist.

What WordPress and WooCommerce give you before any SEO plugin

A fresh WooCommerce install is less bare than people assume. Out of the box you get:

  • Editable slugs: every product, product category and product tag has a slug you can change in the editor.
  • An XML sitemap: WordPress has generated a basic sitemap at /wp-sitemap.xml since version 5.5. Yoast SEO and most other SEO plugins switch it off and publish their own.
  • Product structured data: WooCommerce prints JSON-LD Product markup on single product pages, with the name, description, SKU, main image and an offer built from price and stock status.
  • A barcode field: since WooCommerce 9.2, the Inventory tab has a field labeled "GTIN, UPC, EAN, or ISBN" (WooCommerce). Before that, stores needed a plugin or put barcodes in the SKU field.

What core does not give you: a separate SEO title and meta description per product, control over which archives get indexed, and identifiers or brand in the markup for every variation. That is the job of Yoast SEO, Rank Math or a similar plugin.

Check one WordPress setting before anything else: Settings > Reading > "Search engine visibility". A staging site promoted to live with "Discourage search engines from indexing this site" still ticked is one of the most frequent reasons a new WooCommerce store gets no organic traffic at all.

Caching, images and plugins: WooCommerce page speed

Speed is the part of WooCommerce SEO most general guides lead with, and it matters mostly through Core Web Vitals. Google measures loading (Largest Contentful Paint, good within 2.5 seconds), responsiveness (Interaction to Next Paint, good under 200 milliseconds) and visual stability (Cumulative Layout Shift, good below 0.1), and says good scores align with what its ranking systems reward (Google Search Central). On a WooCommerce store, four things move those numbers most:

  • A page cache with the right exclusions. Cache product and category pages, but never Cart, Checkout or My Account, which WooCommerce says must stay dynamic because they show customer-specific data (WooCommerce developer docs).
  • Images uploaded at display size. A 4,000-pixel supplier photo scaled down by the browser is the usual cause of a slow Largest Contentful Paint on product pages. Resize and compress before upload, or use an image plugin that serves WebP.
  • Fewer plugins that load on every page. Sliders, popups and page builder add-ons often load their scripts sitewide, including on product pages that never use them.
  • HTTPS everywhere, with old http:// URLs redirected, so product links and images do not mix protocols.

Product permalinks: pick a base before the catalog grows

Under Settings > Permalinks, WooCommerce offers four product permalink options (WooCommerce docs). For the stonewashed linen duvet cover used as the example in this guide, they produce:

WooCommerce product permalink options

Defaultexample.com/product/stonewashed-linen-duvet-cover/No
Shop baseexample.com/shop/stonewashed-linen-duvet-cover/No
Shop base with categoryexample.com/shop/duvet-covers/stonewashed-linen-duvet-cover/Yes
Custom baseAny prefix you type, such as example.com/bedding/stonewashed-linen-duvet-cover/No
Only the option with the category in the path ties product URLs to the category tree, so it is the only one that breaks when you move a product.

The category-in-URL option looks tidy, but it ties every product URL to a category. Move the duvet cover from "Duvet covers" to "Linen bedding" during a range review and its URL changes. The default or shop base keeps product URLs stable however often you reorganize the category tree, and stable URLs keep their links and ranking history. A keyword in the URL is a small signal; a forgotten redirect is a big problem.

Two rules from the WooCommerce documentation matter here. The product base must not match a taxonomy base, so a product base of "shop" and a category base of "shop" collide. And changing any base changes existing URLs, so old links and indexed pages return 404 errors unless you add redirects. If product pages 404 right after a change, saving the Permalinks page again regenerates the rewrite rules.

Product category pages, tag pages and attribute archives

WooCommerce creates three kinds of archive pages, and they deserve different treatment.

  • Product categories (/product-category/duvet-covers/ by default): your main landing pages for broad queries such as "linen duvet cover". Index them, give the important ones an intro with real buying information, and keep the tree shallow enough that each category holds enough products to be useful. You can rename the base under Settings > Permalinks, in the Optional section.
  • Product tags (/product-tag/...): usually created on the fly by whoever edits products, which produces hundreds of near-empty pages such as "linen", "Linen" and "linnen". Either curate a short list of tags that match real searches or set tag archives to noindex in your SEO plugin.
  • Attribute archives: a global attribute only gets public pages when "Enable archives?" is ticked for it under Products > Attributes. Then example.com/color/sage/ lists every sage product. That can work for one or two attributes people search by, such as material, and creates thin pages for the rest.

Global pa_ attributes vs custom product attributes

Attributes are where WooCommerce SEO and product data meet. WooCommerce has two kinds:

  • Global attributes are created under Products > Attributes, with a list of terms you reuse across products. Their taxonomy names start with pa_ (pa_color, pa_size). Only global attributes feed the product filter blocks and widgets, attribute archives and consistent variation dropdowns.
  • Custom product attributes are typed on one product's Attributes tab. They print in the Additional information tab, but you cannot reuse them, filter on them or keep their spelling consistent across products.

A catalog built on custom attributes ends up with "Sage", "sage green" and "Sage Green" on three products and a color filter that cannot be built. Move anything shoppers filter or search by into a global attribute with a fixed list of terms, and keep free-text custom attributes for details that are unique to one product.

The Filled column shows on what share of products each attribute has a value. An attribute filled on 38% of products makes a weak filter.

Filters also create URLs. WooCommerce's attribute filters add a filter_ parameter per attribute to the category URL, such as ?filter_color=sage, and every combination of color, size and price is another crawlable address. Most stores should keep filter combinations out of the index and let category pages rank. A few high-demand combinations can become real landing pages with their own links and copy. Our guide to faceted navigation SEO explains how to decide filter by filter.

Variable products: one indexable URL, many SKUs

A WooCommerce variable product is one page with variations underneath. Variations do not get their own permalinks, which suits SEO: links, reviews and ranking history all collect on one URL. The data per variation still matters, because Google Shopping, merchant listings and your own filters read it.

Each variation has its own image, SKU, "GTIN, UPC, EAN, or ISBN", regular and sale price, stock settings and description (WooCommerce). For the duvet cover with three sizes and three colors, that means nine variations, each with:

  • Its own SKU and GTIN. A queen-size sage cover and a king-size charcoal cover are different trade items with different barcodes. Our guide to GTIN, UPC and EAN explains which code goes where.
  • A variation image for every color, so the main image changes when a shopper picks sage instead of sand.
  • Only true options marked "Used for variations". Size and color are options; material and thread count are plain attributes on the parent.
  • A default only when it helps. Set "Default Form Values" to the best seller if there is a clear one. Otherwise the page shows the price range, which is honest.

Google's product variant structured data guidelines ask that each variant can be preselected through a distinct URL, usually with query parameters, and that the group keeps one canonical URL without variant selectors. WooCommerce preselects options from attribute_ parameters in the URL, such as /product/stonewashed-linen-duvet-cover/?attribute_pa_color=sage&attribute_pa_size=queen. Use those URLs as the variant links in your Merchant Center feed and keep the canonical on the parent URL.

The WooCommerce documentation also notes that above 30 variations the dropdowns stop updating based on earlier choices and list every option, so shoppers can pick combinations that do not exist (WooCommerce). If a product has 6 sizes, 8 colors and 2 fabrics (96 variations), consider splitting it by fabric. Two products with clear names usually serve shoppers and search better than one page with a long list of combinations.

Product schema in Yoast SEO and Rank Math, compared

Because WooCommerce already prints Product markup, the plugin decision is about what gets added and whether you end up with two Product entities on one page.

Product schema from WooCommerce, Yoast SEO and Rank Math

WooCommerce coreA basic Product entity with name, description, SKU, image and offers, plus rating data when reviews are enabledNo identifiers or brand for every variationNone, built in
Yoast SEO + Yoast WooCommerce SEOConnects the product to the rest of Yoast's schema graph (Yoast)GTIN8, GTIN12/UPC, GTIN13/EAN, GTIN14/ITF-14 and MPN fields on every variation, printed in the structured dataThe WooCommerce SEO add-on
Rank MathWooCommerce Product schema type picked per product in the Schema tab; price, SKU and stock status pulled from WooCommerce (Rank Math)Brand from a product taxonomy you select under General Settings > WooCommerceChoosing a GTIN key (Pro)
Core WooCommerce already prints a Product entity; the plugins differ in whether variation identifiers and brand end up in it.

Whichever you use, open one product's page source and search for application/ld+json. You want a single Product entity whose price, currency, availability, GTIN and brand match what the page shows. To see what complete markup looks like for your product type, build a sample with our product schema generator and compare.

The plugin is only the printer. If the brand is empty or the GTIN sits in a custom field the plugin does not read, the markup stays incomplete whichever plugin you install.

The WooCommerce product fields that feed rankings

Most of the ranking work on a WooCommerce store happens in the product editor. Field by field:

  • Product name: becomes the H1 and the default title. Put the product type and a defining attribute in it ("Stonewashed Linen Duvet Cover") and leave size and color to the variations.
  • Slug: generated from the name when you first save. Shorten it before publishing, since changing it later needs a redirect.
  • Product description: the main content in the Description tab. Use it for what a buyer needs: material, weave, fabric weight, closure, care and exact dimensions. Supplier text copied by every other reseller adds little.
  • Product short description: shown next to the price in most themes. Two or three lines with the facts that decide the purchase.
  • SEO title and meta description: plugin fields in Yoast or Rank Math. Build them from attributes rather than letting the plugin cut the first sentence of the description.
  • Product image and gallery: alt text is stored per image in the Media Library, so one image reused on 20 products carries one alt text. Describe what the image shows.
  • SKU and "GTIN, UPC, EAN, or ISBN": in the Inventory tab of the parent and of every variation.
  • Attributes: global where possible, with "Visible on the product page" ticked for the specs shoppers compare.
  • Categories: assign one primary category that matches the breadcrumb you want. Yoast and Rank Math both let you set it.
  • Linked Products: Upsells and Cross-sells add links between related products, which helps crawlers find deep products.
  • Catalog visibility: "Shop and search results", "Shop only", "Search results only" or "Hidden". Hidden products are still reachable by URL, so a hidden test product can still end up in Google.

For the reasoning behind each element, independent of platform, see our product page SEO guide.

Before and after: one linen duvet cover in WooCommerce

Here is the duvet cover as it arrived from a supplier import, next to the same product after a cleanup that took no new plugin. After the cleanup, Duvet covers is its primary category, with Linen bedding as a second category.

One linen duvet cover, before and after the cleanup

NameDuvet cover linen 240x220 sage NEWStonewashed Linen Duvet Cover
Slug and URLduvet-cover-linen-240x220-sage-new/product/stonewashed-linen-duvet-cover/
DescriptionA 40-word supplier paragraph shared with every resellerWeave, fabric weight, dimensions per size, care instructions and what makes stonewashed linen soft from the first night
AttributesOne custom attribute, "Colour: sage | sand | charcoal", not usable as a filterGlobal pa_color (Sage, Sand, Charcoal) and pa_size (Twin, Queen, King) used for variations; material (100% linen), fabric weight (165 g/m²) and closure (coconut buttons) as visible attributes on the parent
VariationsNine, without SKUs or GTINs, all showing the same sand-colored photoNine, with SKUs from LDC-SAG-TW to LDC-CHA-KG, a GTIN-13 each and one photo per color
SEO titleEmpty, so the plugin used the first 155 characters of the descriptionStonewashed Linen Duvet Cover, Twin to King, 3 Colors
Meta descriptionEmpty, so the plugin used the first 155 characters of the descriptionStonewashed 100% linen duvet cover, 165 g/m², with coconut button closure. Twin, Queen and King in sage, sand and charcoal. Machine washable at 40 °C.
Showing 7 of 7 rows
Every change is a field edit inside WooCommerce, and each one feeds filters, markup or the search snippet.

The product now qualifies for the color and size filters, prints a complete Product entity, and shows a meta description written for the search result instead of a truncated sentence.

Seven WooCommerce shortcuts that leak organic traffic

  1. Switching the product base on a live store without redirects. Every indexed product URL breaks at once.
  2. Letting product tags multiply. Hundreds of one-product tag archives dilute crawling and internal links.
  3. Storing filterable facts as custom attributes. No filter, no attribute archive, no consistent values.
  4. Two or three sources of Product markup. WooCommerce, an SEO plugin and a reviews plugin each print their own entity, sometimes with different prices.
  5. A page builder template that skips the description. If the product template does not render the Description field, the text you wrote never reaches the page.
  6. Deleting sold-out products. Keep temporarily unavailable products live and marked out of stock; redirect discontinued ones to the closest replacement or category.
  7. Publishing supplier descriptions unchanged. When the same paragraph appears on dozens of stores, your page has little reason to rank above theirs.

Other platforms have their own versions of these problems; compare our Shopify SEO checklist and the Magento SEO guide if you run more than one store.

Filling WooCommerce SEO fields in bulk with WISEPIM

Most of the work above is field work, repeated across every product and variation. WISEPIM connects to WooCommerce through its REST API. An import pulls names, SKUs, prices, descriptions and short descriptions, stock, images, attributes, categories, tags and variations, plus brand, EAN and SEO fields. In WISEPIM you fill missing attributes, descriptions, SEO titles and meta descriptions with AI, check completeness with Quality Guard, and export the result back, including the Yoast SEO title and meta description when the store uses Yoast. Variations go back under their parent product.

Connecting needs only the store URL: you approve WISEPIM in WordPress admin and the API keys are created for you.

You can connect a store through the WooCommerce connection and work on up to 100 products on the free plan.

Diego Nijboer

CTO and Co-Founder at WISEPIM, building AI-powered solutions that transform product data management for e-commerce businesses. Over 10 years of experience solving complex technical challenges in e-commerce and PIM systems.

Frequently asked questions

Still have questions?

Can't find the answer you're looking for? Please get in touch with our team.

Contact Support

Yes. WooCommerce runs on WordPress, so you control slugs, permalinks, sitemaps and page content, and it prints basic Product structured data on its own. Rankings still depend on setup and data: a stable permalink base, indexed categories, thin archives kept out of the index, one source of Product markup and complete product fields such as descriptions, attributes, GTINs and meta descriptions.

Core WooCommerce has no separate SEO title or meta description field per product and no control over which archives are indexed, so most stores add one SEO plugin. Yoast SEO and Rank Math both work. Yoast's per-variation GTIN fields need the paid Yoast WooCommerce SEO add-on; in Rank Math, choosing a GTIN key is a Pro feature. Install one, not both.

Usually not. WooCommerce needs a base to tell product URLs apart from pages and posts, and removing it takes a plugin or custom rewrite rules that can clash with page slugs. The SEO gain from a shorter URL is small. On an existing store, the change also breaks every indexed product URL unless each one gets a 301 redirect.

Since WooCommerce 9.2, every product and every variation has a "GTIN, UPC, EAN, or ISBN" field in its Inventory settings. Enter the barcode of each sellable item there, one per variation. Then check that your SEO plugin and your Google Merchant Center feed read that field, since older plugins stored GTINs in their own custom fields.

Only if they are curated. Tags created on the fly by editors tend to produce many archives with one or two products and near-duplicate names, which waste crawling and compete with category pages. Either keep a short list of tags that match real searches and give them content, or set product tag archives to noindex in your SEO plugin.

Keep exploring

Hand-picked next steps to go deeper.

Better product data, better results.Get more sales.