All posts
Ray Iyer
Ray Iyer
Co-founder, Anglera

The technical SEO checklist for WooCommerce product pages

A technical checklist for WooCommerce product pages — rendering, schema, titles, canonicals, images, links, speed — built for buyers and AI agents

The technical SEO checklist for WooCommerce product pages

Rich product data does nothing for a search engine or an AI shopping agent if it never makes it into the rendered page. This checklist walks through the technical layer of a WooCommerce product page — the part that turns enriched attributes, specs, and copy into something Google, Bing, and answer engines can parse and trust. Each item notes why it matters for both human buyers and the crawlers/agents reading on their behalf.

Rendering: what's actually in the HTML

WooCommerce product templates are rendered server-side by PHP on request, so in a standard setup (default theme templates, single-product.php, or WooCommerce Blocks) your product name, price, description, and attributes are present in the initial HTML response — no JavaScript execution required. That's good for crawlability by default.

The risk is what merchants add on top: page builders (Elementor, Divi), headless/React storefronts built on the WooCommerce Store API, or heavy client-side personalization can push key content into JS-rendered blocks that only appear after hydration. Since WooCommerce 10.6, images in the Product Image block (used on block-based templates) lazy-load by default and treat every image the same — the main image isn't automatically exempted (more in Images and alt text, below).

Check it: compare view-source: output to the rendered DOM in DevTools. If the product name, price, or description text is missing from view-source but present in the Elements panel, it was injected by JavaScript after load — a crawler without full rendering (or a fetch-based AI agent) may miss it.

Structured data: Product schema

WooCommerce ships built-in structured data via the WC_Structured_Data class, output as JSON-LD (application/ld+json) on single product pages only — not on archive pages, per Google's guidance that markup should describe the page it's on. The default payload covers @type: Product with name, image, description, sku, and an offers object with price, currency, availability, URL, and seller.

That default set is rarely enough for full merchant-listing eligibility. Google's merchant-listing guidelines require only name, image, and an offers object with price and priceCurrency — but availability, itemCondition, aggregateRating, review, brand, and GTIN/MPN identifiers are recommended, and adding them expands which rich-result features you qualify for. WooCommerce core doesn't emit BreadcrumbList schema either — that typically comes from an SEO plugin (Yoast, Rank Math, AIOSEO) once breadcrumbs are enabled, using the product's primary category.

WooCommerce core already has a native "GTIN, UPC, EAN, or ISBN" field on the product data panel (the _global_unique_id post meta) — check there before adding a custom field. Extend the schema through the filters WooCommerce already exposes rather than hand-writing a second script tag:

add_filter( 'woocommerce_structured_data_product', function( $markup, $product ) {
    $markup['brand'] = [
        '@type' => 'Brand',
        'name'  => 'Your Brand',
    ];
    if ( $gtin = $product->get_meta( '_global_unique_id' ) ) {
        $markup['gtin'] = $gtin;
    }
    return $markup;
}, 10, 2 );

If you run an SEO plugin alongside custom code, check the rendered page for duplicate Product blocks — some plugins add their own on top, which confuses parsers.

Titles and meta descriptions

WooCommerce core has no title-tag or meta-description editor; without an SEO plugin, WordPress falls back to a generic Product Name – Store Name document title. Yoast, Rank Math, and AIOSEO all add per-product title and meta-description fields, plus their own title templates. Front-load the term a buyer would actually type, add a distinguishing qualifier (size, material, model year), and keep the title within roughly 55–60 characters so it doesn't truncate in the SERP; keep the meta description in the 140–160 character range.

Canonicals

Watch two sources of duplication. First, product variations selected via query strings (e.g., ?attribute_color=blue) load on the same base product URL and share one canonical by default — don't let a plugin generate separate crawlable URLs per variation. Second, a product in multiple categories can end up with more than one indexable path if your permalink structure includes the category slug. Set a clear primary category (used by SEO plugins for canonical and breadcrumb logic alike), and make sure filter/sort parameters on category archives canonicalize back to the clean URL.

Images and alt text

Every product image uploaded to the Media Library has separate Title, Caption, Alt Text, and Description fields — only Alt Text is read by screen readers, image search, and text-based crawlers/agents via the alt attribute. Write alt text that describes the product plus the visible variant (color, material, angle), skip keyword stuffing, and never leave the raw filename (IMG_4021.jpg) as the alt value. Since WooCommerce 10.6, the Product Image block lazy-loads every image by default, including the first one, so set the above-the-fold image to load eagerly (the woocommerce_product_image_loading_attr filter, or your theme's gallery markup) to protect Largest Contentful Paint.

Internal linking

The single-product template's related-products, upsell, and cross-sell blocks are WooCommerce's built-in internal linking layer — pulled from the same category/tag taxonomy, so an intentional category structure directly improves link relevance. Beyond the template, link into product pages from buying guides and comparison content using descriptive anchor text (the product name or use case, not "click here" or a bare URL) — specific anchors give search engines and AI agents unambiguous context about the destination page.

Performance and Core Web Vitals

Product pages are usually image-heavy, so the biggest, most controllable levers are image weight and render-blocking assets: serve WebP/AVIF, size images for their actual display dimensions, lazy-load below-the-fold gallery images while forcing the LCP image eager (see above), and offload static assets to a CDN. Theme and plugin bloat on the template (extra CSS/JS from bundled upsell or review plugins) is the next most common Core Web Vitals hit — audit what's actually loading on a single product page, not just the homepage.

Crawlability

WooCommerce applies noindex via WordPress's wp_robots filter (in place since WordPress 5.7) to cart, checkout, and my-account pages — intentional, since those are session-specific, and it should generally be left alone. Separately, confirm the global "Discourage search engines from indexing this site" setting wasn't left checked after a migration.

WordPress core (5.5+) auto-generates a basic sitemap at wp-sitemap.xml, but most stores run an SEO plugin's sitemap instead (sitemap_index.xml or similar) — submit only one in Search Console, since conflicting sitemaps send mixed signals about which URLs matter. Also verify robots.txt isn't blocking /wp-content/uploads/ or plugin asset paths needed to render the page — a common leftover from staging-site rules.

How to validate

  • View-source vs. rendered DOM: load the product page, check view-source:, then compare to DevTools Elements — anything present only in the rendered DOM is JS-dependent.
  • curl as a bot: curl -A "Googlebot" https://yourstore.com/product/slug/ to see the raw HTML a non-JS crawler receives.
  • Rich Results Test: paste the product URL into Google's Rich Results Test to confirm the Product (and BreadcrumbList, if present) JSON-LD parses and which rich-result types it's eligible for.
  • Search Console: use URL Inspection to confirm the canonical Google selected, and check Page Indexing for unexpected exclusions.
  • PageSpeed Insights: check LCP, CLS, and INP on an actual product template, not just the homepage.

Verified as of July 2026. WooCommerce version behavior (notably default lazy-loading, introduced in 10.6) and Google's structured data requirements change over time — confirm against your installed version and the live Google Search Central docs before shipping.

None of this checklist works if the data behind it is thin — a Product schema with a missing GTIN, a generic one-line description, or an alt tag that just repeats the title still renders correctly but tells buyers and AI agents nothing useful. Anglera plugs into your PIM or commerce platform and keeps that underlying data — attributes, specs, use-cases, identifiers — continuously enriched, so the template and schema work above has real content to fill.

Ray Iyer

About the author

Ray IyerCo-founder, Anglera

Ray is a co-founder of Anglera, building the product-data infrastructure for agentic commerce — turning messy catalogs into structured, AI-readable data that buyers and answer engines can find. Previously product at Uber; Stanford CS.

See it on your own SKUs.

A 30-minute walkthrough on your categories and your supplier data.

Book a demo