# OPTIM-08 — Revue de code performance (wp-performance-review)

**Date** : 2026-06-25 · **Statut** : 📊 ANALYSE (perf en pause — actions à planifier) · **Mode** : read-only.
**Périmètre** : code maison — thème `toulouse-les-orgues`, plugins `pepille_shortcode(_bouton)`, mu-plugins. (Divi/tiers exclus.)
**Bilan** : 5 Critical, 7 Warning, 4 Info. Risque surtout **serveur (TTFB/CPU/DB)**. Aucun polling JS, aucun `wp_remote_*`, aucun cron problématique. Requêtes `$wpdb` **toutes préparées** (pas d'injection).

## 🔴 Critical
- **CRIT-01 — `posts_per_page => -1` non bornés à chaque pageview** : `single-artiste.php:104` (charge tous les events futurs puis filtre en PHP), nav préc/suiv `single-{artiste:257,evenement:58,ensemble:117,instrument:339}` (charge tout le CPT pour un seul ID), `moteurAlphab.php:12` (tous artistes/ensembles pour les initiales). Fix : `get_adjacent_post()`, `'fields'=>'ids'`, `LEFT(post_title,1)` en SQL, filtre interprète dans la requête.
- **CRIT-02 — `pepille_shortcode.php:350-419` `fonction_moteurEvent`** rejoue **4× la même requête `-1`** (dates/lieux/events/eventsArtistes) pour des `<select>`. Fix : une requête réutilisée.
- **CRIT-03 — N+1 ACF/`get_terms` en boucle** : `pepille_shortcode.php:86-129/725-760` (~8-12 lookups/event), `autresArtistes.php:138-153`, `single-actualites.php:125/185` (`get_terms` appelé dans la boucle, résultat **jamais utilisé** = code mort). Fix : précharger les meta en lot, supprimer le bloc mort.
- **CRIT-04 — `pepille_shortcode.php:2329-2352` `fonction_pageActu`** : `meta_query compare=REGEXP` sur `meta_value` (non indexé) alimenté par `$_GET` (ReDoS + perf). Fix : requête bornée + assainir `$_GET`.
- **CRIT-05 — Session PHP en front** : `functions.php:675-681` + `resultatArtistes.php:9` `session_start()` → non cacheable. **Déjà restreint** aux URLs moteur (correctif récent). Fix : supprimer la session (valeurs viennent de `$_GET`) pour rendre ces pages cacheables.

## 🟠 Warnings
meta_query sur `value` binaires (`oui/non`) → taxonomie/`EXISTS` ; `$_GET`/`$_SESSION` réinjectés sans `esc_html` (`resultatArtistes.php:133-135`) ; assets globaux non conditionnés (Font Awesome v5 complet, logos JS) ; CDN tiers bloquants (slick jsdelivr, FA fontawesome.com) → héberger en local ; `get_col DISTINCT meta_value` non caché (6 fichiers, listes ville/dept) → transient 1h ; `recupSession.php` = code mort avec `session_start()` inconditionnel (inclus nulle part) + `.bak` (déjà nettoyés côté prod par SECURITY-07).

## 🔵 Info
`no_found_rows=>true` et `fields=>'ids'` **absents partout** (gain cumulé) ; enqueue sans `$ver`/`defer` ; `pepille_shortcode_bouton` = pur traitement de chaîne (RAS) ; mu-plugins RAS perf.

## Priorisation (quand on rouvrira la perf)
1. Supprimer la session pages moteur (CRIT-05) — gain cacheabilité. 2. Borner les `-1` des single-* (CRIT-01 + `no_found_rows`/`fields=ids`). 3. Collapse `moteurEvent` 4→1 (CRIT-02) + retirer `get_terms` mort (CRIT-03). 4. `pageActu` REGEXP→borné + assainir (CRIT-04). 5. Précharger meta (CRIT-03). 6. Cache listes ville/dept, binaires→taxonomie.

Complète OPTIM-07 (CWV) : OPTIM-07 = front (images/fonts/render-blocking, vise LCP) ; OPTIM-08 = back (TTFB/CPU/DB).
