Making products easy to find
Module 7: Being found and hosting · Reading time: 10 minutes
Learning objective: After this lesson you can create product pages that search engines understand, check which structured data WooCommerce includes, and avoid the pitfalls of sold-out products, filters and duplicate content.
Key concepts: product page, product title, product description, category page as landing page, structured data, JSON-LD, Product, Offer, AggregateOffer, availability, GTIN, SKU, out of stock, filters and parameters, canonical, product sitemap, free product listings
What is different about a shop
The basics of being found are covered in the WordPress course, lesson 9.2: titles, meta descriptions, headings, the sitemap, noindex, Search Console and redirects when addresses change. All of that applies to a shop as well. On top of that, a shop has three challenges of its own:
- Lots of pages that look alike. Ten teapots with almost the same text, variations, filters on colour and price: a search engine has to choose which page matters.
- Pages that come and go. Products sell out, are discontinued or come back.
- Search engines show product data themselves. Price, stock and reviews can appear in the search result, if the search engine can read them from your page.
This lesson covers those three. More about keywords, writing copy and local search will follow in the course Being found online (in development).
A product page that says something
A search engine and a customer want to know the same things: what is it, why this one and not another, and what does it cost. At Theehuis Example, a weak product page looks like this:
- title "Theepot 3" (teapot 3);
- description copied from the supplier, the same as at twenty other shops;
- one photo without alt text.
A strong version:
- a title with what people search for: "Gietijzeren theepot 0,8 liter, zwart" (cast iron teapot, 0.8 litre, black);
- a short description of two or three sentences with the essentials (capacity, material, who it is for);
- a long description in your own words: how to use it, care, what comes with it, dimensions, and the questions customers really ask;
- several photos with descriptive alt text (WordPress course, lesson 4.4);
- SKU and, if you have one, the GTIN (EAN code) filled in (lesson 3.1).
Supplier texts are tempting, but then the same text appears on many sites. A search engine usually shows only one of them. At the very least, write the first paragraph yourself.
Category pages are often more important than you think. Someone searching for "cast iron teapot" wants to see a choice, not a single product. So give your categories a short introduction and a clear name, and keep the structure simple (Teapots > Cast iron, not five levels deep).
Structured data: what WooCommerce includes
Structured data is a piece of code in your page that describes, in a fixed format, what is on the page. WooCommerce uses JSON-LD for this: a <script type="application/ld+json"> block that it places at the bottom of the product page (in the footer of the HTML). It contains an object of the type Product with:
name,url,description(the short description, or otherwise the long one) andimage;sku(or the product ID if you did not fill in an SKU) andgtinif you entered a valid GTIN;offers: an Offer with the price (in apriceSpecification),priceCurrency,availabilityand the seller (your shop name). For a variable product with different prices, it becomes an AggregateOffer with the lowest and highest price;availabilityas a schema.org address:https://schema.org/InStock,OutOfStockorBackOrder(for backorders);- with reviews, also the average rating and the reviews.
This is what a shortened example looks like:
{
"@type": "Product",
"name": "Gietijzeren theepot 0,8 liter, zwart",
"sku": "TP-GIJ-08",
"offers": [{
"@type": "Offer",
"price": "39.95",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock"
}]
}What structured data does do: the search engine knows for certain what the price and stock are, and can show them. What it does not do: make you rank higher or guarantee a rich search result. Google decides for itself whether to show anything.
Three pitfalls:
- Duplicate schema. An SEO plugin or theme also adds a Product. Then there are two, sometimes with different prices. Choose one source and switch the other off.
- Price from the cache. After a price change, an old, stored page shows the old price, in the text and in the schema. Clear the cache after changing prices (lesson 6.4).
- Wrong VAT display. The schema takes the price as your shop shows it. If you show consumers prices including VAT (lesson 4.1), that is also the price in the schema.
You can check this with the schema.org validator or Google's test (see Further reading), or with the exercise in this lesson.
Out of stock, discontinued, back in stock
What do you do with a product that has temporarily run out? Under WooCommerce > Settings > Products > Inventory you can hide out-of-stock items from the catalogue. Do not do this lightly for products that are only temporarily sold out: the page still exists, but drops out of your category pages, while customers who find it through a search engine still see it. For a product that is coming back, it is better to leave the page up with "out of stock", an expected date or an alternative. The schema then says OutOfStock, and that is honest.
If a product is permanently discontinued, you have three options:
- leave the page up with a clear notice and links to successors (if it still gets a lot of visitors);
- a 301 redirect to the successor or the category (if there is a real replacement);
- delete the page, so it returns a 404 or 410 (if there is nothing comparable).
What you should not do: redirect every discontinued product to the homepage. Search engines treat that as a kind of 404, and visitors end up searching in vain.
Filters, sorting and duplicate content
Filters on colour, size and price, and sorting by price, create addresses such as /theepotten/?filter_kleur=zwart&orderby=price. Every combination is a new address with almost the same content. With lots of filters, you end up with thousands. A search engine then spends its time on those variants instead of on your products.
What helps:
- a canonical on every filtered page pointing to the unfiltered page (WordPress and most SEO plugins do not always do this automatically for parameters: check it);
- no links to filtered addresses in your menu;
- do not create variations as separate products when it is really one product (lesson 3.2);
- one address per product, even if it is in several categories. By default WooCommerce uses
/product/<naam>/without the category in the address; leave it that way unless you know what you are doing.
The product sitemap
Since version 5.5, WordPress creates its own sitemap (/wp-sitemap.xml) with a section per post type. Products are a post type, so there is a sub-sitemap such as /wp-sitemap-posts-product-1.xml. If you use an SEO plugin, it often creates its own sitemap at a different address (and switches off the WordPress one). Check that your products are in it, that the cart, checkout and My account are not in it (they have noindex, lesson 2.2), and submit the sitemap in Search Console.
If you want your products to appear in the shopping tabs of search engines as well, you can do that with a product feed, for example through the free listings in Google Merchant Center. That is beyond the scope of this course, but the structured data above is the foundation.
Summary
- A product page has a title people search for, its own description, good photos with alt text, and a filled-in SKU and GTIN.
- WooCommerce places a Product schema in JSON-LD on the product page with price, currency, stock and seller; it does not guarantee a rich search result.
- Prevent duplicate schema and old prices in the cache.
- Temporarily out of stock: leave the page up; permanently gone: successor, 301 or 404/410, not the homepage.
- Filters create duplicate content; use canonicals and check your product sitemap.
Quiz
Exercise
Exercise A7.1: Does a search engine understand your product? Enter the address of your shop and the slug or address of a product (leave it empty and the program takes the first product from your Store API). The program fetches the product through the Store API, requests the product page and reads all application/ld+json blocks. It then looks in robots.txt or /wp-sitemap.xml for the sitemap with products. Green if there is exactly one Product with a name, an offers with a price and priceCurrency, an availability that matches the stock, an image and an SKU or GTIN; if the price in the schema matches the price in the Store API; if the page has no noindex and a canonical pointing to itself; and if the product is in a product sitemap. Orange if there are two or more Product blocks, no SKU and no GTIN, a different price, no canonical, no image, or if the product is not in the sitemap. Red if there is no Product schema, the page has noindex or the price (offers) is missing.
Question for yourself (not checked): also paste the address of your product page into the schema.org validator. Does it see the same as the program?
Further reading
- Free WordPress course 9.2: Search visibility: the basics
- Free WordPress course 4.4: Media: images and alt text
- Structured data for products (Google Search Central): https://developers.google.com/search/docs/appearance/structured-data/product
- Schema Markup Validator (schema.org): https://validator.schema.org/
- Managing products (woocommerce.com): https://woocommerce.com/document/managing-products/
