Ajout du schema JSON-LD BlogPosting pour les articles photo

Les photo blog posts génèrent maintenant un JSON-LD BlogPosting avec headline, datePublished et lien vers le schema Person via @id. PhotoBlogPostContent passe description, date et tags à PhotoLayout qui les transmet au composant SEO.
This commit is contained in:
Jalil Arfaoui 2026-02-21 14:58:40 +01:00
parent c0cb3e08a0
commit 91296ecdf5
3 changed files with 34 additions and 2 deletions

View file

@ -76,6 +76,22 @@ const personJsonLd = {
], ],
}; };
// Article JSON-LD (for blog posts / articles)
const articleJsonLd =
ogType === "article" && article
? {
"@context": "https://schema.org",
"@type": "BlogPosting",
headline: title,
description,
image: imageUrl,
url: canonicalUrl,
inLanguage: locale,
...(article.publishedTime && { datePublished: article.publishedTime }),
author: { "@id": `${siteUrl}/#person` },
}
: null;
// WebSite JSON-LD (only on home pages) // WebSite JSON-LD (only on home pages)
const websiteJsonLd = isHomePage const websiteJsonLd = isHomePage
? { ? {
@ -129,6 +145,11 @@ const websiteJsonLd = isHomePage
<!-- JSON-LD Person --> <!-- JSON-LD Person -->
<script type="application/ld+json" set:html={JSON.stringify(personJsonLd)} /> <script type="application/ld+json" set:html={JSON.stringify(personJsonLd)} />
<!-- JSON-LD Article (blog posts only) -->
{articleJsonLd && (
<script type="application/ld+json" set:html={JSON.stringify(articleJsonLd)} />
)}
<!-- JSON-LD WebSite (home pages only) --> <!-- JSON-LD WebSite (home pages only) -->
{websiteJsonLd && ( {websiteJsonLd && (
<script type="application/ld+json" set:html={JSON.stringify(websiteJsonLd)} /> <script type="application/ld+json" set:html={JSON.stringify(websiteJsonLd)} />

View file

@ -53,7 +53,14 @@ const lightboxImages = galleryImages.map(img => ({
})); }));
--- ---
<PhotoLayout title={`${post.data.title} - Blog Photo - Jalil Arfaoui`} enableScroll={true} lang={lang}> <PhotoLayout
title={`${post.data.title} - Blog Photo - Jalil Arfaoui`}
description={post.data.description}
ogType="article"
article={{ publishedTime: new Date(post.data.date).toISOString(), tags: post.data.tags }}
enableScroll={true}
lang={lang}
>
<div class="album-container"> <div class="album-container">
<CategoryNav currentCategory="blog" opaque={false} lang={lang} /> <CategoryNav currentCategory="blog" opaque={false} lang={lang} />

View file

@ -6,6 +6,8 @@ import type { Locale } from '../utils/i18n';
interface Props { interface Props {
title?: string; title?: string;
description?: string; description?: string;
ogType?: string;
article?: { publishedTime?: string; tags?: string[] };
enableScroll?: boolean; enableScroll?: boolean;
lang?: Locale; lang?: Locale;
} }
@ -13,6 +15,8 @@ interface Props {
const { const {
title = "Galerie Photo - Jalil Arfaoui", title = "Galerie Photo - Jalil Arfaoui",
description = "Portfolio photo de Jalil Arfaoui. Portraits, paysages, cultures, musique, nature.", description = "Portfolio photo de Jalil Arfaoui. Portraits, paysages, cultures, musique, nature.",
ogType,
article,
enableScroll = false, enableScroll = false,
lang = 'fr', lang = 'fr',
} = Astro.props; } = Astro.props;
@ -24,7 +28,7 @@ const {
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{title}</title> <title>{title}</title>
<SEO title={title} description={description} /> <SEO title={title} description={description} ogType={ogType} article={article} />
<!-- Google Fonts - Karla --> <!-- Google Fonts - Karla -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">