travels on a strange planet

blend in with the humans

Schema.org and You


Posted on Aug 5, 2026

Structured data using schema (schema.org) is something new since I last worked on web pages. Basically, it’s data that you add to your web page source that helps indexers understand and interpret your page.

Modern SEO

Originally, I ran across this trying to learn about modern SEO. The better that indexers understand your page, the better your chances of being in the search results of the search engine for that index. This used to be an exercise in adding keywords and meta tags, and making sure your HTML was well-structured - tables for tabular data, properly nested headers, etc.

Today, it means using the proper meta tags and well-formed semantic HTML, but it also means adding machine-readable structured data to each page. There is an open standard for structured data with over 800 types and 1500 properties to describe just about every type of content on the web, and there are proposals to add even more.

Structured Data Formats

There are several formats in which you can add structured data to your web page, like RDFa or Microformats, but by far the most well supported is JSON-LD. It’s based on JSON so it’s lightweight and easy for humans to read and write.

{
  "@context": "https://json-ld.org/contexts/person.jsonld",
  "@id": "http://dbpedia.org/resource/John_Lennon",
  "name": "John Lennon",
  "born": "1940-10-09",
  "spouse": [
    "http://dbpedia.org/resource/Yoko_Ono",
    "http://dbpedia.org/resource/Cynthia_Lennon"
  ]
}

Because I’m working on an ecommerce site, the two types I am most interested in are BreadcrumbList and Product. The Product entity is pretty self-explanatory: it describes a product for sale. BreadcrumbList is an entity that describes the breadcrumbs used to navigate to the page (product) in question, and therefore the categories that the product belongs to. These are both pretty important types of information when trying to describe the contents and meaning of a product for sale page.

The breadcrumbs created by WooCommerce, though, leave a lot to be desired. I use a snippet to customize the breadcrumbs and BreadcrumbList. The snippet updates the SEO plugin’s WebPage entity with the customized BreadcrumbList and suppresses the built-in WooCommerce BreadcrumbList.

I create the Product entity schema in the schema generator I wrote for the site-specific plugin I authored. It generates the basic Product attributes as well as Offers and AggregateOffers for simple (single) products and variable products (with multiple variations). An Offer describes the sales attributes for a product, like the price and stock status, while an AggregateOffer combines the attributes of product variations of variable products.

So with all of this data now on the web page, I can validate the syntax and content using the schema.org validator. One tricky thing I ran into with the validator is that it combines all entities into a single graph, if they are properly linked. This bit me because at first, my items were not properly linked so they showed up separately, and I thought something was wrong when the validator merged them and I saw only one item listed. I even filed a bug report about it.

Next Steps

Now that I’ve tamed the schema for the ecommerce page, it’s time to add structured data to my blog. I’ve only just started, but it looks like the main entities I care about are Blog, BlogPosting, and possibly BreadcrumbList. Hugo doesn’t have built in support for schema, so I’ll have to roll it all by hand, but having worked on schema for the ecommerce site, I feel like I have a good head start.