Comment générer des articles connexes dans un blog Astro
Voici une idée pour générer des articles connexes dans un blog Astro + Markdown.
Vous pouvez utiliser le code avec l'API de certains CMS si vous modifiez les parties de recherche/filtrage.
Environnement de fonctionnement :
- astro v1.9.1
Structure du site web
Le blog Astro + Markdown pour cet exemple est le suivant ;
src/
├─ pages/
│ └─ [slug].astro
├─ posts/
│ ├─ first-post.md
│ ├─ second-post.md
│ └─ ...
├─ lib/
│ └─ getRelatedPosts.js[slug].astro dans le répertoire pages est le modèle de billet de blog. Le chemin d'accès à l'URL d'un article serait quelque chose comme https://example.com/[slug]/.
Frontmatter YAML pour un billet Markdown
Frontmatter YAML pour cet exemple :
---
title: Mon premier article
slug: first-post
categories: ["libre", "anglais"]
---Créez une fonction pour générer des articles connexes
Ensuite, créez getRelatedPosts.js dans le répertoire lib pour y placer une fonction personnalisée.
src/
├─ pages/
│ └─ [slug].astro
├─ posts/
│ ├─ first-post.md
│ ├─ second-post.md
│ └─ ...
├─ lib/
│ └─ getRelatedPosts.js <- ceciDe la manière la plus simple, obtenons "4 articles dans la même catégorie que le message actuel".
export function getRelatedPosts(allPosts, currentSlug, currentCats) {
const relatedPosts = allPosts.filter(
post =>
post.frontmatter.slug !== currentSlug &&
post.frontmatter.categories.includes(currentCats[0])
)
return relatedPosts.slice(0, 4) // Obtenir les 4 premiers articles avec slice()
}- Récupère tous les articles (
allPosts- tableau), l'article actuel (aveccurrentSlug), et ses catégories (currentCats- tableau). - Filtre sur les article ayant la première catégorie de l'article actuelle (
currentCats- array) sauf l'article actuel (currentSlug) de tous les articles (allPosts- array). - Obtenir les quatre premiers articles en tant que
relatedPosts.
Il serait possible de filtrer jusqu'aux articles "contenant le même tag" "l'ordre du nombre de mêmes tags", etc. si vous êtes très motivé pour aller plus loin.🙂
Add a random select function
Si vous souhaitez générer des articles connexes sélectionnés de manière aléatoire, ajoutez une fonction aléatoire lors du renvoi des articles connexes.
export function getRelatedPosts(allPosts, currentSlug, currentCats) {
// fonction de sélection aléatoire
const randomLot = (array, num) => {
let newArray = []
while (newArray.length < num && array.length > 0) {
const randomIndex = Math.floor(Math.random() * array.length)
newArray.push(array[randomIndex])
array.splice(randomIndex, 1)
}
return newArray
}
const relatedPosts = allPosts.filter(
post =>
post.frontmatter.slug !== currentSlug &&
post.frontmatter.categories.includes(currentCats[0])
)
return randomLot(relatedPosts, 4) // sélection aléatoire
// return relatedPosts.slice(0, 4)
}Afficher les articles connexes dans le modèle d'article
Ensuite, [slug].astro serait comme suit ;
---
import { getRelatedPosts } from "../lib/getRelatedPosts"
export async function getStaticPaths() {
// Obtenir tous les postes
const allPosts = await Astro.glob("../posts/*.md")
// Obtenir le nombre de postes
const numberOfPosts = allPosts.length
return allPosts.map((post) => ({
params: {
slug: post.frontmatter.slug,
},
props: {
post,
// Passer le props des articles connexes
relatedPosts: getRelatedPosts(
allPosts,
post.frontmatter.slug,
post.frontmatter.categories
),
},
}))
}
// Obtenir les articles connexes
const { relatedPosts } = Astro.props
---
// Afficher les articles connexes ici
{relatedPosts.length > 0 && (
relatedPosts.map((post) => (
<li><a href={`/${post.frontmatter.slug}/`}>{post.frontmatter.title}</a></li>
))
)}En cas général, vous devez éliminer les brouillons d'articles, ou créer un composant pour les articles connexes. Faites-le comme vous le souhaitez.
Voilà, c'est fait !