RSS : flux filtré par catégorie (/feed?category=nom) #58

Closed
opened 2026-05-13 21:29:33 +00:00 by cedricAbonnel · 1 comment
Owner

Problème

Il n'existe qu'un seul flux RSS global (/feed). Impossible de s'abonner uniquement à une catégorie spécifique.

Comportement souhaité

/feed?category=maison retourne uniquement les articles de la catégorie « maison ».
Sans paramètre, le flux global reste inchangé.


Analyse technique

État actuel (public/feed.php)

Le filtrage des catégories privées existe déjà (lignes 22–31) :

$all = array_values(array_filter(
    $articles->getAll(publishedOnly: true),
    static function (array $a) use ($now, $privateCats): bool {
        if (strtotime((string)($a['published_at'] ?? '')) > $now) return false;
        $cat = trim($a['category'] ?? '');
        return $cat === '' || !in_array($cat, $privateCats, true);
    }
));

Implémentation

1. Lire et valider le paramètre ?category= :

$filterCat = trim($_GET['category'] ?? '');

2. Ajouter la condition dans le filtre existant :

static function (array $a) use ($now, $privateCats, $filterCat): bool {
    if (strtotime((string)($a['published_at'] ?? '')) > $now) return false;
    $cat = trim($a['category'] ?? '');
    if ($cat !== '' && in_array($cat, $privateCats, true)) return false;
    if ($filterCat !== '' && mb_strtolower($cat) !== mb_strtolower($filterCat)) return false;
    return true;
}

3. Adapter les métadonnées du flux RSS :

// Titre et lien self reflètent le filtre
$feedTitle = $filterCat !== ''
    ? siteTitle() . ' — ' . $filterCat
    : siteTitle();

$feedUrl = $filterCat !== ''
    ? $base . '/feed?category=' . rawurlencode($filterCat)
    : $base . '/feed';

4. Retourner un 404 si la catégorie demandée n'existe pas :

if ($filterCat !== '' && empty($all)) {
    // Optionnel : vérifier que la catégorie existe réellement
    // Pour l'instant, retourner un flux vide est acceptable
}

Découvrabilité

Sur les pages de catégorie (/categorie/nom), ajouter un <link rel="alternate"> dans <head> :

<link rel="alternate" type="application/rss+xml"
      title="Flux RSS — Catégorie : nom"
      href="/feed?category=nom">

Lien

Complète naturellement le ticket #53 (syndication/fédération entre blogs).

Fichiers concernés

  • public/feed.php — filtre $filterCat + métadonnées adaptées (~15 lignes)
  • templates/post_list.php ou templates/categories.php<link rel="alternate"> sur les pages de catégorie (optionnel, ticket séparé)
## Problème Il n'existe qu'un seul flux RSS global (`/feed`). Impossible de s'abonner uniquement à une catégorie spécifique. ## Comportement souhaité `/feed?category=maison` retourne uniquement les articles de la catégorie « maison ». Sans paramètre, le flux global reste inchangé. --- ## Analyse technique ### État actuel (`public/feed.php`) Le filtrage des catégories privées existe déjà (lignes 22–31) : ```php $all = array_values(array_filter( $articles->getAll(publishedOnly: true), static function (array $a) use ($now, $privateCats): bool { if (strtotime((string)($a['published_at'] ?? '')) > $now) return false; $cat = trim($a['category'] ?? ''); return $cat === '' || !in_array($cat, $privateCats, true); } )); ``` ### Implémentation **1. Lire et valider le paramètre `?category=`** : ```php $filterCat = trim($_GET['category'] ?? ''); ``` **2. Ajouter la condition dans le filtre existant** : ```php static function (array $a) use ($now, $privateCats, $filterCat): bool { if (strtotime((string)($a['published_at'] ?? '')) > $now) return false; $cat = trim($a['category'] ?? ''); if ($cat !== '' && in_array($cat, $privateCats, true)) return false; if ($filterCat !== '' && mb_strtolower($cat) !== mb_strtolower($filterCat)) return false; return true; } ``` **3. Adapter les métadonnées du flux RSS** : ```php // Titre et lien self reflètent le filtre $feedTitle = $filterCat !== '' ? siteTitle() . ' — ' . $filterCat : siteTitle(); $feedUrl = $filterCat !== '' ? $base . '/feed?category=' . rawurlencode($filterCat) : $base . '/feed'; ``` **4. Retourner un 404 si la catégorie demandée n'existe pas** : ```php if ($filterCat !== '' && empty($all)) { // Optionnel : vérifier que la catégorie existe réellement // Pour l'instant, retourner un flux vide est acceptable } ``` ### Découvrabilité Sur les pages de catégorie (`/categorie/nom`), ajouter un `<link rel="alternate">` dans `<head>` : ```html <link rel="alternate" type="application/rss+xml" title="Flux RSS — Catégorie : nom" href="/feed?category=nom"> ``` --- ## Lien Complète naturellement le ticket #53 (syndication/fédération entre blogs). ## Fichiers concernés - `public/feed.php` — filtre `$filterCat` + métadonnées adaptées (~15 lignes) - `templates/post_list.php` ou `templates/categories.php` — `<link rel="alternate">` sur les pages de catégorie (optionnel, ticket séparé)
Author
Owner

Ticket migré vers le dépôt Folio : cedricAbonnel/folio#43

Ticket migré vers le dépôt Folio : https://git.abonnel.fr/cedricAbonnel/folio/issues/43
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: cedricAbonnel/varlog#58