Ajouter des URL dans WordPress – url rewriting
Il peut être nécessaire d’avoir des routes dont le contenu n’est pas directement connu du CMS. C’est le cas notamment si on se connecte à une API pour aller chercher des contenus à l’extérieur de WordPress. Cours de la bourse, offres d’emplois, liens de téléchargements contrôlés … Pour cela, on utilise l’URL rewriting.
Pour chaque requête reçue, WordPress va chercher à quel contenu correspond l’URL demandée, puis génère la réponse. Et s’il n’y ne trouve pas de contenu associé, il envoie une page 404.
Heureusement, il est facile de référencer des URL supplémentaires dans le CMS. La méthode n’est vraiment pas compliqué, mais comme je ne m’en souviens jamais, voici un petit mémo.
Ajouter une règle de réécriture pour que WordPress reconnaisse l’URL
add_rewrite_rule( string $regex, string|array $query, string $after = 'bottom' );
La documentation est ici : add_rewrite_rule
Ce code est à ajouter via le hook init.
Ajouter ses propres variables de requêtes (query_vars)
C’est ce que j’oublie tout le temps 😀
add_filter( 'query_vars', 'custom_query_vars' );
function custom_query_vars( $query_vars ) {
$query_vars[] = 'customVar';
return $query_vars;
}
Ce code est aussi à ajouter via le hook init.
Si cette partie est oubliée, vous ne retrouverez jamais vos variables dans les query vars.
Réagir à le route
A partir de là, WordPress connait votre URL, mais ne sais pas quoi en faire. Vous avez maintenant quantité de solutions pour « accrocher » l’exécution de votre code à cette route. Voici les deux qui me semblent les plus propres :
Générer la page grâce à un template
La meilleure méthode est probablement de renvoyer un template particulier pour notre route. Il suffit d’indiquer le fichier php correspondant avec le hook template_include.
add_action( 'template_include', function( $template ) {
if ( get_query_var( 'customVar' ) == false || get_query_var( 'customVar' ) == '' ) {
return $template;
}
return get_template_directory() . '/template-name.php';
} );
La bonne nouvelle est qu’aucun contenu n’a encore été envoyé lorsque le template est appelé, ce qui nous permet de modifier / ajouter les headers de la réponses. Très pratique si la route doit retourner un document qui n’est pas HTML (JSON, PDF, image, … )
Agir lors du choix du template
J’ai vu cette solution dans un plugin officiel. La première semble toutefois préférable si j’en crois la documentation du hook à utiliser : template_redirect.
add_action( 'template_redirect', 'custom_function', -100 );
A vous de choisir 😉