Yoast SEO for Shopify: Schema
Yoast SEO for Shopify outputs schema.org markup. It does this based on data available in Shopify and additional data filled through the app's interface. Other apps that add structured data functionality (e.g., reviews, recipes, etc) can stitch that data into our schema.org data. More information about our approach, technology, and specification can be found here.
Altering the schema graph
All pieces in our graph contain an @id attribute. This ID can be used for a property to reference an existing piece,
or to extend an existing piece with additional data. Multiple <script> tags can be placed on a webpage, where the
combination of all pieces from all <script> tags should result in one connected graph of schema data. Validate all
changes with our preferred validation tools.
More about the specific @id values and how we create them can be found here.
Adding pieces
Generally, our graph will contain an Organization, and references that Organization as the publisher of a WebSite.
We'll also add that the current WebPage is a part of the WebSite. If you want to add additional data to this graph
that references a specific piece, this can be done by referencing the @id property. For example, you could add
an AggregateRating where the item that is being reviewed is the Organization:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "AggregateRating",
"@id": "https://www.example.com/#/schema/AggregateRating/1",
"ratingValue": "4",
"ratingCount": "250"
"itemReviewed": {
"@id": "https://www.example.com/#/schema/Organization/1"
}
}
]
}
Editing pieces
Existing pieces on the schema graph can also be edited. This can only be done by adding additional data to the pieces.
For example, the current WebPage can be enhanced with the FAQPage type and have Question pieces added. This example
relies on the @id property of the existing WebPage, which will result in merging the data into one big WebPage / FAQPage piece.
{
"@context": "https://schema.org",
"@type": "FAQPage",
"@id": "https://www.example.com/pages/frequently-asked-questions",
"mainEntity": [{
"@type": "Question",
"name": "Is there a local shop we can visit?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. The shop is only online."
}
}]
}
Availability of each piece
Not all pieces will be relevant for every page on an online store. We describe the core logic of when these pieces are added to a page. When altering the graph, the same logic should be taken into account.
Check the pieces are enabled
Through the Yoast SEO for Shopify app, several pieces can be disabled. In these cases, the pieces will never be output.
We store this data in the metafield yoast_seo.settings on the shop object. It's a JSON-type metafield, where the
boolean enabled status of these pieces is stored in schema.outputControls.
| Schema piece | Metafield |
|---|---|
| The entire graph | shop.metafields.yoast_seo.value.schema.outputControls.schema |
Organization | shop.metafields.yoast_seo.value.schema.outputControls.organization |
WebSite | shop.metafields.yoast_seo.value.schema.outputControls.website |
WebPage | shop.metafields.yoast_seo.value.schema.outputControls.webpage |
Article | shop.metafields.yoast_seo.value.schema.outputControls.article |
Product | shop.metafields.yoast_seo.value.schema.outputControls.product |
BreadcrumbList | shop.metafields.yoast_seo.value.schema.outputControls.breadcrumb |
Check the Organization's name being defined
The Organization piece will only be added when the name is defined in the settings of the Yoast SEO for Shopify app.
In the same yoast_seo.settings metafield on the shop object, the data for the representation of the organization
also exists. The organization name should not be empty. That name is stored in
shop.metafields.yoast_seo.value.schema.siteRepresentation.organizationName.
Checking for a valid Article
While a WebPage might always be put on the page, the Article relies on the Organization and thus it also relies on
the organization name to be defined.
An Article also requires data for the description property. We re-use the meta description for this by default. Without
a meta description, the article will not be output.
The third requirement for an Article is to have an image to show. This image can be the page_image or a defined site
image which is stored in shop.metafields.yoast_seo.value.siteSettings.siteDefaults.siteImage.url and exists in the
global Liquid variable images. The image can also be taken from the article.image object, or used from our OpenGraph
setting which is stored in article.metafields.yoast_seo.indexable.value.open_graph_image_url.
Constructing ID parameters
All pieces in our schema output can referenced via an @id attribute. To replicate the @id value, this is the logic we apply.
Organization:shop.url | append: '/#/schema/organization/1'WebSite:shop.url | append: '/#/schema/website/1'WebPage:canonical_urlArticle:canonical_url | append: '#/schema/article/' | append: article.idProduct:canonical_url | append: "/#/schema/Product"Offer:shop.url | append: '/#/schema/Offer/' | append: variant.idBreadcrumbList:canonical_url | append: '/#/schema/breadcrumb'ImageObject:shop.url | append: '/#/schema/ImageObject/' | append: image.id