Add canonical Person schema and social links to layouts
- Add SOCIAL_LINKS import to BaseLayout and BlogPost - Add Master Person schema to BaseLayout - Reference Person @id in BlogPost article schema Hubert The Eunuch
This commit is contained in:
parent
5b9d4b3a14
commit
861263437c
@ -5,7 +5,7 @@ import Footer from '../components/Footer.astro';
|
|||||||
import GridOverlay from '../components/GridOverlay.astro';
|
import GridOverlay from '../components/GridOverlay.astro';
|
||||||
import Navigation from '../components/Navigation.astro';
|
import Navigation from '../components/Navigation.astro';
|
||||||
import CustomCursor from '../components/CustomCursor';
|
import CustomCursor from '../components/CustomCursor';
|
||||||
import { HTML_MARKER, SITE_TITLE, SITE_DESCRIPTION } from '../consts';
|
import { HTML_MARKER, SITE_TITLE, SITE_DESCRIPTION, SOCIAL_LINKS } from '../consts';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
title?: string;
|
title?: string;
|
||||||
@ -17,15 +17,49 @@ interface Props {
|
|||||||
modifiedTime?: Date;
|
modifiedTime?: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
title = SITE_TITLE,
|
title = SITE_TITLE,
|
||||||
description = SITE_DESCRIPTION,
|
description = SITE_DESCRIPTION,
|
||||||
usePadding = true,
|
usePadding = true,
|
||||||
image,
|
image,
|
||||||
type = 'website',
|
type = 'website',
|
||||||
publishedTime,
|
publishedTime,
|
||||||
modifiedTime,
|
modifiedTime,
|
||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
|
|
||||||
|
// Master Person schema - establishes canonical identity across all pages
|
||||||
|
const personSchema = {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "Person",
|
||||||
|
"@id": `${SOCIAL_LINKS.website}/#person`,
|
||||||
|
"name": "Nicholai Vogel",
|
||||||
|
"url": SOCIAL_LINKS.website,
|
||||||
|
"email": SOCIAL_LINKS.email,
|
||||||
|
"jobTitle": "VFX Supervisor & Technical Artist",
|
||||||
|
"description": "VFX Supervisor specializing in both 2D and 3D VFX, AI and high-end technical visualization.",
|
||||||
|
"knowsAbout": [
|
||||||
|
"Houdini",
|
||||||
|
"Nuke",
|
||||||
|
"ComfyUI",
|
||||||
|
"Python",
|
||||||
|
"VFX Pipeline",
|
||||||
|
"Real-time VFX",
|
||||||
|
"Motion Graphics",
|
||||||
|
"Technical Art"
|
||||||
|
],
|
||||||
|
"sameAs": [
|
||||||
|
SOCIAL_LINKS.linkedin,
|
||||||
|
"https://www.instagram.com/nicholai.exe"
|
||||||
|
],
|
||||||
|
"affiliation": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "Biohazard VFX",
|
||||||
|
"url": "https://biohazardvfx.com",
|
||||||
|
"founder": {
|
||||||
|
"@id": `${SOCIAL_LINKS.website}/#person`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
---
|
---
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
@ -40,14 +74,18 @@ const {
|
|||||||
document.documentElement.setAttribute('data-theme', theme);
|
document.documentElement.setAttribute('data-theme', theme);
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
<BaseHead
|
<BaseHead
|
||||||
title={title}
|
title={title}
|
||||||
description={description}
|
description={description}
|
||||||
image={image}
|
image={image}
|
||||||
type={type}
|
type={type}
|
||||||
publishedTime={publishedTime}
|
publishedTime={publishedTime}
|
||||||
modifiedTime={modifiedTime}
|
modifiedTime={modifiedTime}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<!-- Master Person Schema - Canonical Identity -->
|
||||||
|
<script type="application/ld+json" set:html={JSON.stringify(personSchema)} />
|
||||||
|
|
||||||
<slot name="head" />
|
<slot name="head" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import TableOfContents from '../components/TableOfContents.astro';
|
|||||||
import PostNavigation from '../components/PostNavigation.astro';
|
import PostNavigation from '../components/PostNavigation.astro';
|
||||||
import RelatedPosts from '../components/RelatedPosts.astro';
|
import RelatedPosts from '../components/RelatedPosts.astro';
|
||||||
import { Image } from 'astro:assets';
|
import { Image } from 'astro:assets';
|
||||||
|
import { SOCIAL_LINKS } from '../consts';
|
||||||
|
|
||||||
interface NavPost {
|
interface NavPost {
|
||||||
title: string;
|
title: string;
|
||||||
@ -56,6 +57,7 @@ const {
|
|||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
|
|
||||||
// Article structured data (JSON-LD)
|
// Article structured data (JSON-LD)
|
||||||
|
// References the canonical Person @id from BaseLayout for knowledge graph linking
|
||||||
const articleSchema = {
|
const articleSchema = {
|
||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "Article",
|
"@type": "Article",
|
||||||
@ -64,14 +66,10 @@ const articleSchema = {
|
|||||||
"datePublished": pubDate.toISOString(),
|
"datePublished": pubDate.toISOString(),
|
||||||
"dateModified": (updatedDate || pubDate).toISOString(),
|
"dateModified": (updatedDate || pubDate).toISOString(),
|
||||||
"author": {
|
"author": {
|
||||||
"@type": "Person",
|
"@id": `${SOCIAL_LINKS.website}/#person`
|
||||||
"name": "Nicholai Vogel",
|
|
||||||
"url": "https://nicholai.work"
|
|
||||||
},
|
},
|
||||||
"publisher": {
|
"publisher": {
|
||||||
"@type": "Person",
|
"@id": `${SOCIAL_LINKS.website}/#person`
|
||||||
"name": "Nicholai Vogel",
|
|
||||||
"url": "https://nicholai.work"
|
|
||||||
},
|
},
|
||||||
"mainEntityOfPage": {
|
"mainEntityOfPage": {
|
||||||
"@type": "WebPage",
|
"@type": "WebPage",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user