Skip to content

Type de ressource : Schéma Sanity (Document)
Fichier source : apps/studio/schemaTypes/post.ts
Statut : Actif
Slice : 2 (Blog)
Version : 1.0


SchĂ©ma principal pour les articles de blog du site. Contient les mĂ©tadonnĂ©es de l’article (titre, slug, auteur, image, catĂ©gories, date de publication) et le corps du texte en Portable Text.

  • ModĂ©liser les articles de blog avec toutes les mĂ©tadonnĂ©es nĂ©cessaires
  • Permettre l’association d’auteurs et de catĂ©gories aux articles
  • Supporter le contenu riche via Portable Text
  • Faciliter le rendu et l’indexation des articles
  • CrĂ©ation et Ă©dition d’articles de blog
  • Affichage des articles sur la page d’index du blog
  • Rendu des articles individuels avec leur contenu complet
  • Filtrage et tri des articles par auteur, catĂ©gories et date
Relation Schéma Type Description
Dépend de author Référence Chaque article a un auteur obligatoire
Dépend de category Référence Un article peut avoir plusieurs catégories
Dépend de blockContent Composition Le champ body utilise le schéma blockContent
UtilisĂ© par Aucun - SchĂ©ma racine, non rĂ©fĂ©rencĂ© par d’autres

Nom du champ Type Obligatoire Description Validation
title string ✅ Titre de l’article de blog Aucune
slug slug ✅ Slug URL gĂ©nĂ©rĂ© depuis le titre source: 'title', maxLength: 96
author reference ✅ RĂ©fĂ©rence vers un auteur RĂ©fĂ©rence vers author
mainImage image ❌ Image principale de l’article Hotspot activĂ©
categories array ❌ Liste des catĂ©gories RĂ©fĂ©rences vers category
publishedAt datetime ✅ Date et heure de publication Aucune
body blockContent ✅ Corps du texte en Portable Text Utilise le schĂ©ma blockContent

Aucun champ SEO spĂ©cifique n’est implĂ©mentĂ© dans ce schĂ©ma.

Nom du champ Type Description
body array Contenu Portable Text (blocs + spans) via le schéma blockContent

Champ Type Validation Description
title string Aucune Titre de l’article
slug slug source: 'title', maxLength: 96 Généré automatiquement depuis le titre
author reference Référence vers author Auteur obligatoire
publishedAt datetime Aucune Date de publication
body blockContent Aucune Contenu de l’article
Champ Type Description
_id string ID unique du document
_type string Type du document (post)
_createdAt string Date de création (généré par Sanity)
_updatedAt string Date de derniÚre modification (généré par Sanity)
title string Titre de l’article
slug { _type: 'slug'; current: string } Slug URL
author Author Référence vers le schéma author
mainImage ImageAsset Image principale (optionnel)
categories Category[] Liste des catégories (optionnel)
publishedAt string Date de publication
body PortableTextBlock[] Contenu Portable Text

Non implĂ©mentĂ© - ce schĂ©ma n’a pas de champ status. Les documents sont toujours considĂ©rĂ©s comme publiĂ©s.


apps/studio/schemaTypes/post.ts
import {defineField, defineType} from 'sanity'
export default defineType({
name: 'post',
title: 'Post',
type: 'document',
fields: [
defineField({
name: 'title',
title: 'Title',
type: 'string',
}),
defineField({
name: 'slug',
title: 'Slug',
type: 'slug',
options: {
source: 'title',
maxLength: 96,
},
}),
defineField({
name: 'author',
title: 'Author',
type: 'reference',
to: {type: 'author'},
}),
defineField({
name: 'mainImage',
title: 'Main image',
type: 'image',
options: {
hotspot: true,
},
}),
defineField({
name: 'categories',
title: 'Categories',
type: 'array',
of: [{type: 'reference', to: {type: 'category'}}],
}),
defineField({
name: 'publishedAt',
title: 'Published at',
type: 'datetime',
}),
defineField({
name: 'body',
title: 'Body',
type: 'blockContent',
}),
],
preview: {
select: {
title: 'title',
author: 'author.name',
media: 'mainImage',
},
prepare(selection) {
const {author} = selection
return {...selection, subtitle: author && `by ${author}`}
},
},
})
*[_type == "post"] {
_id,
title,
slug,
publishedAt,
mainImage,
author->{name, slug},
categories[]->{title, slug}
} | order(publishedAt desc)
*[_type == "post" && slug.current == $slug][0] {
_id,
title,
slug,
publishedAt,
mainImage,
author->{name, slug, image, bio},
categories[]->{title, slug, description},
body
}

Non implĂ©mentĂ© - sanity-typegen n’est pas configurĂ© dans le projet actuel.

// Types à implémenter manuellement si nécessaire
export type Post = {
_id: string;
_type: 'post';
title: string;
slug: { _type: 'slug'; current: string };
author: Author;
mainImage?: ImageAsset;
categories?: Category[];
publishedAt: string;
body: PortableTextBlock[];
};

Scénario Description Résultat attendu
Validation du titre Créer un document sans titre Erreur de validation
Validation de l’auteur CrĂ©er un document sans auteur Erreur de validation
Génération du slug Créer un document avec titre Slug généré automatiquement depuis le titre
Limite du slug Créer un titre de plus de 96 caractÚres Slug tronqué à 96 caractÚres
Scénario Dépendances Description Résultat attendu
Consommation Astro Route Astro + Sanity API Récupération des données via GROQ Données récupérées et typées correctement
Indexation Pagefind Build Astro + Pagefind Indexation du contenu généré Contenu des articles indexé et searchable
Preview Sanity Sanity Studio + Preview API Mode preview pour les drafts Preview fonctionne avec le secret
Scénario Parcours utilisateur Description Résultat attendu
CrĂ©ation → Publication Sanity Studio → Build → Site CrĂ©er et publier un article Article visible sur le site avec toutes les mĂ©tadonnĂ©es
Filtrage par catĂ©gorie Blog → Filtre catĂ©gorie Cliquer sur une catĂ©gorie Articles filtrĂ©s par catĂ©gorie

Composant Type RĂŽle MĂ©thode d’intĂ©gration
Route Astro (blog/index.astro) L2 Listing des articles RequĂȘte GROQ via getSanityClient()
Route Astro (blog/[
slug].astro) L2 Page article individuelle RequĂȘte GROQ dĂ©taillĂ©e via getSanityClient()
Layout (BlogPost.astro) L2 Rendu de l’article Props passĂ©es depuis la route
Pagefind L2 Indexation Indexation du HTML généré par Astro
  • Le schĂ©ma ne supporte pas les drafts (pas de champ status)
  • Les requĂȘtes GROQ doivent utiliser les projections explicites
  • Le slug est utilisĂ© pour gĂ©nĂ©rer les URLs des articles
  • L’auteur est obligatoire pour chaque article
  • Le schĂ©ma ne casse aucun schĂ©ma existant
  • Les requĂȘtes GROQ retournent les donnĂ©es attendues
  • Les types TypeScript sont gĂ©nĂ©rĂ©s correctement (Ă  implĂ©menter)
  • Les tests E2E passent

  • ✅ Les rĂ©fĂ©rences vers author et category sont validĂ©es par Sanity
  • ✅ Les images sont stockĂ©es dans Sanity Asset API avec accĂšs contrĂŽlĂ©
  • ✅ Les permissions Sanity sont configurĂ©es par rĂŽle
  • ✅ Les champs obligatoires (title, author, publishedAt, body) sont validĂ©s cĂŽtĂ© Sanity
  • ✅ Les slugs sont uniques et valides
  • ✅ Les rĂ©fĂ©rences vers author et category pointent vers des documents existants

Limite Valeur StratĂ©gie d’optimisation
Taille du document 16 MB Éviter les champs body trop volumineux
Profondeur des rĂ©fĂ©rences 10 niveaux Limiter les rĂ©fĂ©rences imbriquĂ©es (author → categories)
  • ✅ Utilisation de projections GROQ pour rĂ©duire la taille des rĂ©ponses
  • ✅ Mise en cache CDN pour les requĂȘtes en production
  • ✅ Preview configurĂ© pour dĂ©sactiver le CDN en mode draft

SymptĂŽme Cause probable Solution
Schéma non visible dans Studio Cache du navigateur Vider le cache et rafraßchir
Types TypeScript incorrects Schéma modifié sans régénération Exécuter sanity typegen generate (à implémenter)
RequĂȘte GROQ vide Filtre incorrect VĂ©rifier la syntaxe GROQ
Auteur non affichĂ© RĂ©fĂ©rence cassĂ©e VĂ©rifier que l’auteur existe et n’est pas supprimĂ©
Terminal window
# Extraire le schéma depuis Sanity
npx sanity schema extract
# Générer les types TypeScript (à implémenter)
npx sanity typegen generate

  • ✅ Toujours utiliser des types gĂ©nĂ©rĂ©s par sanity-typegen (Ă  implĂ©menter)
  • ✅ Centraliser les requĂȘtes GROQ dans src/lib/queries.ts (Ă  implĂ©menter)
  • ✅ Documenter les champs et leurs validations
  • ✅ Utiliser defineField pour chaque champ
  • ✅ Configurer le preview pour une meilleure UX dans Studio
  • ✅ Utiliser des validations appropriĂ©es
  • ✅ Mettre Ă  jour ce fichier lors de toute modification du schĂ©ma
  • ✅ RĂ©gĂ©nĂ©rer les types aprĂšs modification (Ă  implĂ©menter)
  • ✅ Tester les requĂȘtes GROQ aprĂšs modification

  • Ajout de champs SEO (metaTitle, metaDescription, ogImage)
  • ImplĂ©mentation de sanity-typegen pour la gĂ©nĂ©ration de types
  • Ajout d’un champ status pour supporter les drafts
  • Centralisation des requĂȘtes GROQ dans un fichier dĂ©diĂ©
  • ❌ Pas de support pour les drafts (pas de champ status)
  • ❌ Pas de champs SEO spĂ©cifiques
  • ❌ Types TypeScript non gĂ©nĂ©rĂ©s automatiquement

  • Documentation Sanity : Schema Types
  • DAT L1 : §4 - ModĂ©lisation et SchĂ©mas des DonnĂ©es
  • SchĂ©mas dĂ©pendants : author, category, blockContent
  • Pages Astro consommatrices : apps/web/src/pages/blog/index.astro, apps/web/src/pages/blog/[...slug].astro
  • Composants d’affichage : apps/web/src/layouts/BlogPost.astro

Date Version Description Auteur
2026-09-15 1.0 Création initiale Devin
Edit page

Last updated: