# OPTIM-04 — Cache de page (WP Super Cache)

**Date** : 2026-06-24
**But** : servir du HTML pré-généré aux visiteurs anonymes/bots → TTFB ~1.5s → ~50ms,
et **éliminer la saturation FPM** (cause du 504 OPTIM-03) : un bot sur une page cachée ne réveille plus PHP/MariaDB.

## Choix
- **WP Super Cache** (Automattic, GPL) — coexiste avec `redis-cache` (page vs objet).
- **Mode Simple** d'abord (`mod_rewrite=0`) : sert via `advanced-cache.php`, **ne touche pas au `.htaccess`**,
  totalement réversible. Upgrade Expert/mod_rewrite possible ensuite (PHP 100% bypassé, ~20ms).
- Pourquoi pas W3TC : voudrait piloter l'object cache lui-même (conflit avec `redis-cache`) + plus complexe.

## Contraintes stack (plugins)
- **WPML** : langues en path (`/fr/`,`/en/`) → URLs distinctes → cache par langue naturel. ✅
- **Exclure du cache** : `/moteursession`, `/moteurartiste` (recherche `pepille_shortcode` dynamique),
  + défauts (wp-admin, wp-login, connectés, CF7 via AJAX).
- **Complianz** (consentement) : JS client-side → compatible HTML caché.

## Changements
1. Plugin `wp-super-cache` posé manuellement (DISALLOW_FILE_MODS) + activé.
2. `wp-config.php` : `define('WP_CACHE', true);`.
3. `wp-content/wp-cache-config.php` :
   - `$cache_enabled = true;` `$super_cache_enabled = true;` `$wp_cache_mod_rewrite = 0;`
   - `$wp_cache_not_logged_in = 1;` (anonymes seulement)
   - `$cache_rejected_uri` += `moteursession`, `moteurartiste`
4. Drop-in `advanced-cache.php` (posé par le plugin).

## Sécurité / risque / rollback
- Anonymes uniquement ; connectés et recherche bypassent → pas de fuite de contenu privé.
- Rollback : `wp super-cache disable` + `wp plugin deactivate wp-super-cache` + `WP_CACHE` false
  → retour à l'état OPTIM-03.

## Versioning
- Snapshot avant : état plugins / drop-ins
- Snapshot après : `wp-cache-config.php`, extrait `.htaccess` (doit rester inchangé en Simple)

## Résultat (vérifié 2026-06-24)
**2 blocants, pas un seul :**
1. `pepille_shortcode/includes/resultatArtistes.php:9` — `session_start()` racine (require'd au boot) → rendu conditionnel (moteur/lettreCible/texteCible). Backup `.bak-20260624-session`.
2. **Découverte clé** : WPML (négociation langue par cookie, site bilingue EN/FR) pose `wp-wpml_current_language` sur chaque page. Or `$wp_cache_not_logged_in=1` désactivait le cache dès qu'UN cookie existe → rien n'était jamais caché.
   - Fix : `$wp_cache_not_logged_in` 1→2 (ne bloque que sur vrais cookies d'auth) + `$wpsc_cookies=array("wp-wpml_current_language")` pour **varier le cache par langue**.

**Mesures :**
- Session supprimée sur pages normales (PHPSESSID uniquement sur pages `moteur`).
- Cache actif : `/artiste/…` **7.3s à froid → 0.018s à chaud (~400×)**, homepage ~0.022s.
- Séparation FR/EN OK (fichiers cache distincts, pas de collision).
- Exclusions OK (`/moteurartiste` non caché), recherche OK (cookie jar), site 200, aucun rollback.

## Statut : ✅ APPLIQUÉ — cache de page opérationnel
