Le plugin Feed permet à Grav de générer automatiquement des flux RSS 2.0, Atom 1.0 et JSON Feed pour n'importe quelle page qui définit un header content (liste d'articles). Il suffit d'ajouter l'extension .rss, .atom ou .json à l'URL de la page pour obtenir le flux correspondant.
Ce tutoriel couvre l'installation, la configuration, la création d'une page dédiée au flux, et un piège rencontré en pratique : le filtrage du contenu réellement affiché dans le flux.
Depuis la racine du site, via le Grav Package Manager (GPM) :
bin/gpm install feed
Le plugin s'installe dans user/plugins/feed/. Il nécessite les plugins Error et Problems, déjà présents sur ce site.
La configuration par défaut du plugin (user/plugins/feed/feed.yaml) :
enabled: true
limit: 10
title: 'My Feed Title'
description: 'My Feed Description'
length: 500
enable_json_feed: false
show_last_modified: false
Comme pour tout plugin Grav, on ne modifie jamais ce fichier directement : on crée une surcharge dans user/config/plugins/feed.yaml :
enabled: true
limit: 20
title: HackTechDev
description: HackTechDev
length: 0
enable_json_feed: true
show_last_modified: true
length: 0 désactive la troncature du contenu dans le flux (article complet). enable_json_feed: true active l'extension .json (désactivée par défaut car elle peut entrer en conflit avec d'autres plugins).
Une page Grav ne devient éligible au flux que si elle définit un header content (une collection d'items). Sur ce site, la page dédiée est user/pages/00.flux/flux.md :
---
title: Derniers articles
visible: false
content:
items: '@root.descendants'
order:
by: date
dir: desc
limit: 20
---
visible: false : la page n'apparaît pas dans le menu, elle n'existe que pour servir de support au flux.@root.descendants : récupère toutes les pages descendantes de la racine du site (voir le piège ci-dessous).00.flux (préfixe 00.) donne la route /flux, donc le flux est accessible via /flux.rss, /flux.atom, /flux.json.@root.descendants remonte toutes les pages du site sans distinction, y compris les pages d'index/organisation (blog.md, default.md) qui n'ont pas de date propre et se retrouvent triées en tête de flux à chaque modification. Le plugin ne propose pas de filtre par type de page dans le langage de collection (content.items) : @root, @self, @page, @taxonomy, .children, .descendants, .modules... mais rien pour dire « uniquement les vrais articles ».
La solution retenue : surcharger les templates du plugin (feed.rss.twig, feed.atom.twig, feed.json.twig) au niveau du thème actif, en filtrant sur le nom de template de page (item/chapter = vrais articles, vs blog/default = pages d'index) :
{% for item in collection if item.template in ['item', 'chapter'] %}
Attention au thème réellement actif : ce site contient deux thèmes, quark et learn2. La présence d'un fichier user/config/themes/quark.yaml ne signifie pas que quark est actif ! Seul pages.theme dans user/config/system.yaml détermine le thème utilisé. Ici, c'est learn2 qui est actif — les surcharges doivent donc être placées dans user/themes/learn2/templates/, pas dans user/themes/quark/templates/ (erreur commise une première fois, silencieusement ignorée par Grav sans le moindre message d'erreur).
Un bon réflexe pour vérifier le thème réellement actif sans ambiguïté : regarder les URLs des assets CSS/JS dans le code source d'une page rendue (/user/themes/<nom>/css-compiled/...).
content.limit: 20 s'applique à la collection brute (avant filtrage Twig). Si des pages d'index se trouvent dans les 20 dernières pages modifiées, le flux affichera moins de 20 vrais articles au final. Pas encore corrigé sur ce site — à surveiller si le flux semble « court ».
Avant de pousser en production, toujours tester le flux en local :
./runServer.sh
curl -s -D - http://127.0.0.1:40779/flux.rss | head -20
bin/grav clearcache --all
bin/grav clearcache (sans --all) ne vide pas le cache Twig compilé — une modification de template peut donc sembler ignorée si on ne pense pas à purger le cache complet après une surcharge de template.