- TrendingParser : lit les logs Apache, compte les visiteurs uniques (IPs, HTTP 200),
supporte plusieurs préfixes (/post/, /book/) et un seul parse via topGrouped()
- /trending?period=… : flux RSS des 50 articles les plus consultés, 10 périodes
de 10 min à 1 an, cache TTL adaptatif
- /tendances : page publique avec sélecteur de période, top 20 articles,
tableau des flux RSS et section méthodologie
- /admin/stats : remplace AccessLogParser (hits) par TrendingParser (visiteurs uniques)
- Page d'accueil : rubrique Tendances alimentée par les logs 1h (fallback DB)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute un concept de "livre" (série de pages ordonnées) avec :
- BookManager : CRUD JSON dans data/books/<slug>.json
- Route /book/<slug> → page de sommaire (table des matières)
- Navigation chapitre ← → en bas de chaque article membre du livre
- Bandeau "Chapitre X/N — Nom du livre" en haut de l'article
- Admin → onglet Livres : créer, éditer, supprimer un livre, ajouter/ordonner les pages via textarea slug
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remplace le formulaire unique par un wizard 5 étapes (création) et
6 étapes (édition) avec auto-sauvegarde en brouillon, détection de
tags depuis le texte (TagSuggester), aperçu SEO, diff avant validation
et plan Markdown dynamique dans l'éditeur.
Détail des changements :
- ArticleManager : +6 méthodes (updatePartialMeta, saveDraftOverlay,
getDraftOverlay, hasDraftOverlay, discardDraftOverlay, commitDraftOverlay)
- .htaccess : routes /new/{uuid}/{1-5} et /edit/{uuid}/{1-6}
- index.php : cases create et edit réécrits en switch($step),
nouveau case autosave_draft et edit_discard_draft
- assets/js/wizard.js : autosave debounce, auto-resize textarea,
scroll curseur, plan TOC dynamique, toggle pills tags
- templates/wizard/ : nav.php + step1..6.php
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Contexte : sur abonnel.fr, session_start() était appelé sur chaque
requête PHP (y compris bots), créant ~17 000 fichiers de session/jour
dans un répertoire custom non nettoyé par le cron Debian. Les workers
PHP-FPM grossissaient en mémoire et le pool saturait (1 188 erreurs
503 en 30 minutes).
Changements :
public/index.php
- session_start() uniquement si le cookie de session existe déjà ou si
la requête est POST. Les bots (GET sans cookie) ne créent plus de
session.
- CSRF commentaires migré de $_SESSION['comment_csrf'] vers un double-
submit cookie (_csrf_c, SameSite=Strict, HttpOnly). La session n'est
plus requise pour les visiteurs anonymes qui postent un commentaire.
templates/comments_section.php
- Génère le token CSRF et le pose en cookie (_csrf_c) au lieu de
l'écrire en session.
public/.htaccess
- Règle Apache 410 Gone pour toute URL contenant un paramètre ?do=
(anciens paramètres DokuWiki : do=media, do=export_pdf…). Traité par
Apache en 2ms sans toucher PHP-FPM.
public/oidc/{start,callback,me}.php
- Correction du bug introduit par 0b8077e : config.php (qui utilise
BASE_PATH) était chargé avant bootstrap.php (qui définit BASE_PATH).
Fix : define('BASE_PATH', …) ajouté avant le require config.php.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>