Chapitre 5.9 — Rewrite API : les URLs propres
⏱️ TL;DR — La Rewrite API est ce qui transforme des URLs « jolies » (
/livres/dune/) en paramètres de requête internes que WordPress résout. Elle repose sur des règles de réécriture (rewrite rules) et des query vars. Le plus souvent, vous n’y touchez pas directement : déclarer un Custom Post Type ou une taxonomie (Partie 7) génère automatiquement les bonnes URLs. Vous n’ouvrez le capot que pour des endpoints custom (ex./mon-compte/commandes/) ou des structures d’URL sur mesure — et alors la règle d’or est de régénérer les règles (flush_rewrite_rules) au bon moment (à l’activation, jamais à chaque requête).
🎯 Objectifs
- Comprendre le rôle des rewrite rules et des query vars.
- Savoir que CPT/taxonomies génèrent leurs URLs automatiquement.
- Ajouter un endpoint ou une règle custom quand c’est nécessaire.
- Maîtriser
flush_rewrite_rules()(quand, et surtout quand pas).
1. Le rôle : de l’URL propre à la requête
Sans réécriture, WordPress répondrait à des URLs du type ?post_type=livre&name=dune. La réécriture permet /livres/dune/ : plus lisible, meilleure pour le SEO et le partage (ch. 2.1).
- Les rewrite rules sont un ensemble de regex associées à des jeux de query vars. WordPress les teste contre l’URL demandée.
- Les query vars sont les variables reconnues (
post_type,name,p,category_name, + les vôtres). - Sur Apache, un
.htaccessredirige tout versindex.php; sur Nginx, une directive équivalente. Ensuite, WordPress fait le vrai routage en interne (pas le serveur web).
2. Le cas courant : rien à faire (ou presque)
La plupart du temps, vous n’écrivez aucune règle. Déclarer un CPT ou une taxonomie avec l’option rewrite (Partie 7) génère automatiquement les URLs :
register_post_type( 'livre', array(
'public' => true,
'rewrite' => array( 'slug' => 'livres' ), // → /livres/{slug}/
// …
) );→ WordPress crée les rewrite rules pour /livres/… pour vous. Idem pour les archives (/livres/) et les taxonomies custom. Ne réinventez pas ce que l’enregistrement fournit.
⚠️ Piège n°1 — le CPT en 404 après création. Vous déclarez un CPT
livre, mais/livres/dune/renvoie 404. Cause : les rewrite rules n’ont pas été régénérées. Solution : aller dans Réglages → Permaliens → Enregistrer (régénère), ou appelerflush_rewrite_rules()à l’activation du plugin (§4). C’est le piège classique des CPT.
3. Ajouter une query var et une règle custom
Pour une URL vraiment sur mesure (ex. /archive/2026/07/ gérée autrement, ou /api-maison/xyz/), on ajoute une query var et une règle :
add_action( 'init', 'monplugin_rewrite' );
function monplugin_rewrite() {
add_rewrite_tag( '%livre_action%', '([^&]+)' ); // reconnaît la var
add_rewrite_rule(
'^livres/([^/]+)/telecharger/?$', // regex de l'URL
'index.php?post_type=livre&name=$matches[1]&livre_action=telecharger',
'top' // priorité sur les règles existantes
);
}
// Rendre la query var accessible
add_filter( 'query_vars', function ( $vars ) {
$vars[] = 'livre_action';
return $vars;
} );
// L'exploiter (ex. avant le rendu)
add_action( 'template_redirect', function () {
if ( 'telecharger' === get_query_var( 'livre_action' ) ) {
// servir un fichier, incrémenter un compteur, etc.
}
} );Pour des endpoints attachés à un type (ex. /mon-compte/commandes/), il existe aussi add_rewrite_endpoint() (utilisé par WooCommerce pour les sous-pages du compte, Partie 10).
4. flush_rewrite_rules() : au bon moment uniquement
Régénérer les règles est coûteux (réécriture des règles, parfois du .htaccess). Règle d’or :
- ✅ À l’activation du plugin (
register_activation_hook), après avoir enregistré le CPT/les règles. - ✅ Manuellement en dev : Réglages → Permaliens → Enregistrer.
- ❌ Jamais à chaque requête (ex. sur
init) : cela détruit la performance du site.
register_activation_hook( __FILE__, function () {
monplugin_enregistrer_cpt(); // enregistre le CPT (mêmes règles qu'au runtime)
flush_rewrite_rules(); // régénère UNE fois, à l'activation
} );
register_deactivation_hook( __FILE__, 'flush_rewrite_rules' ); // nettoyage⚠️ Piège n°2 —
flush_rewrite_rules()surinit. Le tutoriel mal fichu vous fait appelerflush_rewrite_rules()à chaque chargement (dans la fonction d’init). Résultat : les règles sont recalculées à chaque page → site lent. On flush une seule fois, à l’activation.
💡 Pour un dev React — La Rewrite API est le routeur de WordPress : des regex → paramètres (comme des routes dynamiques
/livres/[slug]), sauf que la table de routes est générée et mise en cache (d’où le besoin de la « régénérer » quand elle change — l’équivalent d’un rebuild du manifeste de routes). En pratique : laissez les CPT/taxonomies générer les routes, ne codez des règles que pour les cas spéciaux, et flush uniquement à l’activation.
5. Débogage
- Après tout ajout de CPT/règle : enregistrer les permaliens (ou flush à l’activation).
- Le plugin « Rewrite Rules Inspector » (ou Query Monitor) liste les règles actives et celle qui a matché l’URL courante.
- Vérifier l’ordre (
'top'place la règle avant les règles par défaut) et la regex.
✏️ Exercices
- Vous créez un CPT
evenementet/evenements/gala/renvoie 404. Quelle est la cause et la correction ? - Pourquoi ne faut-il jamais appeler
flush_rewrite_rules()sur le hookiniten production ? - Où et comment appelle-t-on
flush_rewrite_rules()correctement pour un plugin qui déclare un CPT ?
✅ Solution
- Les rewrite rules n’ont pas été régénérées après l’ajout du CPT. Correction : Réglages → Permaliens → Enregistrer, ou appeler
flush_rewrite_rules()à l’activation du plugin (après enregistrement du CPT). - Parce que c’est une opération coûteuse : l’appeler à chaque requête recalcule toutes les règles à chaque page et dégrade fortement la performance.
- Dans le
register_activation_hookdu plugin : d’abord enregistrer le CPT (la même fonction qu’au runtime), puisflush_rewrite_rules()une seule fois. On flush aussi à la désactivation pour nettoyer.
🧠 Quiz de révision
1. Que fait la Rewrite API ?
Elle transforme des URLs propres en query vars internes (via des règles regex) que WP_Query résout.
2. Faut-il écrire des règles pour un CPT ?
Non : l’option rewrite de register_post_type génère les URLs automatiquement ; on ne code des règles que pour des cas sur mesure.
3. Pourquoi un CPT renvoie-t-il souvent 404 juste après sa création ?
Parce que les rewrite rules n’ont pas été régénérées ; il faut ré-enregistrer les permaliens ou flush à l’activation.
4. Quand appeler flush_rewrite_rules() ?
À l’activation du plugin (et à la désactivation pour nettoyer) — jamais à chaque requête (init).
5. Comment ajouter une variable de requête personnalisée ?
Via add_rewrite_tag()/add_rewrite_rule() et le filtre query_vars pour l’autoriser, puis get_query_var() pour la lire.
Partie suivante : Partie 6 — Développer des thèmes.