Aller au contenu principal

Un composant Docusaurus qui prévient le lecteur que l'article a plus d'un an

Affiche une bannière d'avertissement quand le contenu de la page a plus d'un an

· 4 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.
Cet article fait partie de la série Créer des composants Docusaurus :

Journal des modifications

Dernière
added review_date front matter support — a recent review date swaps the warning for a green "still accurate" banner; if the review date is itself over a year old, the standard warning reappears
the component will first check the last update date/time (last_update field in the front matter) before the creation date (date field)

Un composant Docusaurus qui prévient le lecteur que l'article a plus d'un an

⚡
TL;DR

Cet article montre comment créer un composant Docusaurus qui prévient le lecteur quand un billet de blog a plus d'un an. Il s'agit de construire un composant React et de « swizzler » le template BlogPostPage pour y injecter cet avis. Le composant détermine l'âge d'un article en regardant son champ last_update ou date dans le front matter.

Dans cet article, voyons comment afficher un petit cadre « Attention : cet article a au moins un an, ce qui, en années tech, relève quasiment de la préhistoire. »

Nous allons créer un composant React pour Docusaurus et l'injecter dans la page de nos billets de blog : une fois en place, tout fonctionnera comme par magie.

Le voici en action, sur un vieux billet de ce blog :

https://www.avonture.be/blog/joomla-show-table
Old post notice in action

C'est parti.

Créer le composant​

Vous devez créer deux nouveaux fichiers dans votre propre site Docusaurus :

📦 Mise en place du projet : /your_docusaurus_site
Aide

Besoin d'aide ? Cliquez sur le bouton « Aide » ci-dessus pour les instructions de mise en place.

Surcharger le template BlogPostPage​

Côté Docusaurus, nous devons swizzler la page responsable du rendu d'un billet. Cette page s'appelle BlogPostPage.

Pour cela, ouvrez une console et lancez yarn swizzle @docusaurus/theme-classic BlogPostItem/Content.

Dès maintenant, vous avez un nouveau fichier sur votre disque : src/theme/BlogPostItem/Content/index.js

Vous avez peut-être déjà ce fichier

Afficher le changelog de votre article swizzle exactement le même fichier. Si vous avez suivi cet article, ajoutez simplement le nouveau composant à côté de l'existant au lieu de swizzler à nouveau.

Ci-dessous, le contenu original du fichier (Docusaurus v3.8.1) :

import React from 'react';
import clsx from 'clsx';
import {blogPostContainerID} from '@docusaurus/utils-common';
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import MDXContent from '@theme/MDXContent';
export default function BlogPostItemContent({children, className}) {
const {isBlogPostPage} = useBlogPost();
return (
<div
// This ID is used for the feed generation to locate the main content
id={isBlogPostPage ? blogPostContainerID : undefined}
className={clsx('markdown', className)}>
<MDXContent>{children}</MDXContent>
</div>
);
}

Ce composant React encapsule le contenu d'un article de blog en le rendant avec les styles markdown appropriés. Il utilise un hook personnalisé pour déterminer si on affiche la page complète d'un article, et dans ce cas, ajoute un ID spécifique qui sert à la génération de flux de contenu.

Pour injecter notre nouveau composant OldPostNotice, éditez le fichier comme ceci (voir les lignes surlignées) :

import React from 'react';
import clsx from 'clsx';
import {blogPostContainerID} from '@docusaurus/utils-common';
import {useBlogPost} from '@docusaurus/plugin-content-blog/client';
import MDXContent from '@theme/MDXContent';
// highlight-next-line
import OldPostNotice from "@site/src/components/Blog/OldPostNotice";
export default function BlogPostItemContent({children, className}) {
const {isBlogPostPage} = useBlogPost();
return (
// highlight-next-line
<>
// highlight-next-line
<OldPostNotice />
<div
// This ID is used for the feed generation to locate the main content
id={isBlogPostPage ? blogPostContainerID : undefined}
className={clsx('markdown', className)}>
<MDXContent>{children}</MDXContent>
</div>
// highlight-next-line
</>
);
}

Ce composant React affiche le contenu d'un article de blog en combinant un avis pour les anciens articles avec le contenu MDX rendu. Il applique un identifiant spécifique et des classes CSS conditionnellement selon que l'on affiche la page complète du blog ou un aperçu.

Sauvez le fichier et rafraîchissez votre blog. Vous devriez obtenir la même bannière que celle montrée en début d'article.

Information

Le composant utilise le champ date que vous devez mentionner dans votre front matter YAML.

Donc, dans chacun de vos billets .md, vous devez avoir un bloc YAML comme celui-ci :

---
title: Your blog post article
authors: [you]
date: 2025-09-30
---

Marquer un billet relu​

Si vous revenez sur un vieil article et confirmez que le contenu est toujours exact, vous pouvez ajouter un champ review_date dans le front matter :

---
date: 2023-05-10
review_date: 2026-07-30
---

Quand review_date est présent et date de moins d'un an, le composant remplace l'avertissement orange par une bannière verte de confirmation :

✅ Cet article a plus d'un an mais a été relu le 30 juillet 2026 — le contenu est toujours exact.

Si review_date a lui-même plus d'un an, l'avertissement standard réapparaît — parce qu'une relecture périmée ne vaut pas mieux que pas de relecture du tout.

Position de l'avertissement​

L'avis sera placé avant le contenu du billet. Sur mon blog, j'ai manipulé le code ci-dessous pour extraire la toute première image (c'est-à-dire la bannière) afin de l'afficher en premier, puis l'avis, puis le reste de l'article. Mais c'est sans doute trop complexe pour l'instant. Nous verrons ça dans un prochain article.

L'image de bannière est traitée différemment des autres pour exactement la même raison que dans Modifier la façon dont Docusaurus génère les balises img : la première image d'un billet est spéciale et doit être laissée telle quelle.

<div
// This ID is used for the feed generation to locate the main content
id={isBlogPostPage ? blogPostContainerID : undefined}
className={clsx('markdown', className)}>
<MDXContent>{children}</MDXContent>
</div>

Cet article fait partie de la série Créer des composants Docusaurus :
🦋 Rejoignez la conversation sur BlueskyUn compte Bluesky gratuit est nécessaire pour aimer, repartager ou commenter. Ce bloc interroge l'API publique de Bluesky directement depuis votre navigateur (sans cookie, sans connexion) — votre adresse IP parvient donc aux serveurs de Bluesky dès que cette section se charge.

Chargement des commentaires…

Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?