--- title: Unhead Schema.org description: Learn more about Unhead Schema.org. navigation: title: Introduction --- ## Background With Unhead Schema.org you can inject a Schema.org graph into your page. Wrapper functions have been added to make opting in to [Google Rich Results](https://developers.google.com/search/docs/head/guides/core-concepts/search-gallery) nodes easier. For officially supported nodes, when the graph is being resolved it will apply a number of transforms to ensure the data is valid for Google. Otherwise, you can provide your own custom nodes that are passed through as is. ## Site / Page Level Config When resolving the graph, the package will inject config from the site and page level to reduce the amount of boilerplate. For example, if you have a `<title>`{lang="html"} on your page, then it's likely we can use this same title to generate the Schema.org WebPage's `name`. The following inferences are from your `<head>`{lang="html"} data: - `inLanguage` - `<html lang="en">`{lang="html"} (`en`) - `name` - `<title>test</title>`{lang="html"} (`test`) - `description` - `<meta name="description" content="test">`{lang="html"} (`test`) - `url` - `<link rel="canonical" href="https://example.com/my-page">`{lang="html"} (`https://example.com`) - `image` - `<meta property="og:image" content="https://example.com/image.jpg">`{lang="html"} (`https://example.com/image.jpg`) Otherwise, they will come from your [Schema.org Params](/schema-org/getting-started/params). ## Deduping Nodes For certain nodes, only one of them can exist at once. For example, a page can only have one `WebPage` node. When resolving the graph, the package will dedupe nodes based on the `@id` of the node. ## Transformers There's numerous resolvers available to help minimise the work in maintaining and developing Schema. ### URL Transformer Any URL field allows a relevant link to be provided. This link will either be prefixed with the canonical host or the canonical page URL. ```ts import { defineComment } from '@unhead/schema-org/@framework' defineComment({ text: 'This is really cool!', author: { name: 'Harlan Wilton', url: '/user/harlan-wilton', } }) ``` ```json [ { "@id": "https://example.com/#/schema/person/1230192103", "@type": "Person", "name": "Harlan Wilton", "url": "https://example.com/user/harlan-wilton" }, { "@id": "https://example.com/#/schema/comment/2288441280", "@type": "Comment", "author": { "@id": "https://example.com/#/schema/person/1230192103" }, "text": "This is really cool!" } ] ``` ### Image Transformer Uses the same relative link logic as the URL transformer. Additionally, single string images will be transformed to an [ImageObject](https://schema.org/ImageObject) and added as a root node and an applicable link to the `@id` will be added. ```ts import { defineWebPage } from '@unhead/schema-org/@framework' defineWebPage({ image: '/my-image.png', }) ``` ```json { "@id": "https://example.com/#/schema/image/1571960974", "@type": "ImageObject", "contentUrl": "https://example.com//my-image.png", "url": "https://example.com//my-image.png" } ``` ### ID Transformer Providing an `@id` for a Schema node is sometimes useful to setup your own relations. When configuring the `@id` you can provide it as a simple string beginning with `#`. The ID will be resolved to use the canonical host or the canonical page path as a prefix. ```ts import { defineBreadcrumb } from '@unhead/schema-org/@framework' defineBreadcrumb({ '@id': '#subbreadcrumb', 'itemListElement': [ { name: 'Sub breadcrumb link', item: '/blog/test' }, ], }) ``` ```json { "@id": "https://example.com/#subbreadcrumb", "@type": "BreadcrumbList" } ``` ### Type Transformer Providing a string of `@type` will be augmented with the default type. This is to allow fallbacks when the specific `@type` is not supported by Google. ```ts import { defineWebPage } from '@unhead/schema-org/@framework' defineWebPage({ '@type': 'FAQPage', }) ``` ```json { "@type": [ "WebPage", "FAQPage" ] } ``` ### Date Transformer Any date can be provided as a string or a js `Date` object. When a `Date` object is provided it will be transformed to the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. ```ts import { defineWebPage } from '@unhead/schema-org/@framework' defineWebPage({ datePublished: new Date(2022, 1, 10, 0, 0, 0), }) ``` ```json { "datePublished": "2022-01-10T00:00:0+00:00" } ``` ## Third Party Validators To confirm the schema generated is valid, you should run it through both <https://validator.schema.org/> and <https://search.google.com/test/rich-results>.