diff --git a/_config.yml b/_config.yml index cab31b5..a59d593 100644 --- a/_config.yml +++ b/_config.yml @@ -1023,6 +1023,13 @@ Open_Graph_meta: # fb_admins: # fb_app_id: +# Structured Data +# https://developers.google.com/search/docs/guides/intro-structured-data +structured_data: + enable: true + # Choose: json-ld / microdata + format: 'json-ld' + # Add the vendor prefixes to ensure compatibility css_prefix: true diff --git a/layout/includes/head.pug b/layout/includes/head.pug index 56c29f0..59f3782 100644 --- a/layout/includes/head.pug +++ b/layout/includes/head.pug @@ -25,6 +25,9 @@ meta(name="theme-color" content=themeColor) //- Open_Graph include ./head/Open_Graph.pug +//- Structured Data +include ./head/structured_data.pug + !=favicon_tag(theme.favicon || config.favicon) link(rel="canonical" href=urlNoIndex(null,config.pretty_urls.trailing_index,config.pretty_urls.trailing_html)) diff --git a/layout/includes/head/structured_data.pug b/layout/includes/head/structured_data.pug new file mode 100644 index 0000000..d89eab8 --- /dev/null +++ b/layout/includes/head/structured_data.pug @@ -0,0 +1,58 @@ +if theme.structured_data.enable && page.layout === 'post' + - + const format = theme.structured_data.format || 'json-ld' + + const title = page.title + const url = page.permalink + const imageVal = page.cover_type === 'img' ? page.cover : theme.avatar.img + const image = imageVal ? full_url_for(imageVal) : '' + const datePublished = page.date.toISOString() + const dateModified = (page.updated || page.date).toISOString() + const author = page.copyright_author || config.author + const authorHrefVal = page.copyright_author_href || theme.post_copyright.author_href || site.url; + const authorHref = full_url_for(authorHrefVal); + + if (format === 'json-ld') { + const jsonLd = { + "@context": "https://schema.org", + "@type": "BlogPosting", + "headline": title, + "url": url, + "image": image, + "datePublished": datePublished, + "dateModified": dateModified, + "author": [{ + "@type": "Person", + "name": author, + "url": authorHref + }] + }; + + jsonLdScript = JSON.stringify(jsonLd, null, 2); + } else if (format === 'microdata') { + microdata = { + headline: title, + url: url, + image: image, + datePublished: datePublished, + dateModified: dateModified, + authorName: author, + authorUrl: authorHref + }; + } + - + + if (format === 'json-ld') + script(type="application/ld+json"). + !{jsonLdScript} + else if (format === 'microdata') + div(itemscope itemtype="https://schema.org/BlogPosting") + meta(itemprop="headline" content=microdata.headline) + link(itemprop="url" href=microdata.url) + if microdata.image + img(itemprop="image" src=microdata.image alt=microdata.headline) + meta(itemprop="datePublished" content=microdata.datePublished) + meta(itemprop="dateModified" content=microdata.dateModified) + div(itemprop="author" itemscope itemtype="https://schema.org/Person") + meta(itemprop="name" content=microdata.authorName) + link(itemprop="url" href=microdata.authorUrl) \ No newline at end of file diff --git a/scripts/events/merge_config.js b/scripts/events/merge_config.js index fe04871..d263094 100644 --- a/scripts/events/merge_config.js +++ b/scripts/events/merge_config.js @@ -567,6 +567,10 @@ hexo.extend.filter.register('before_generate', () => { enable: true, option: null }, + structured_data: { + enable: true, + format: 'json-ld', + }, css_prefix: true, inject: { head: null,