Tutoriel : Points de terminaison d’URL personnalisés avec l’API de réécriture de WordPress
Avez-vous déjà souhaité pouvoir étendre des publications uniques, des pages ou vos types de publication personnalisés avec un modèle personnalisé qui conserve sa propre structure d’URL ? Avec l’API WordPress Rewrite, c’est tout à fait possible, et pas difficile du tout.
Dans ce didacticiel, nous verrons comment ajouter une vue de type de publication personnalisée unique avec un autre slug qui charge un modèle différent. En d’autres termes, si un seul type de message personnalisé a l’URL "example.com/destination/venice/", vous pouvez ajouter des règles d’URL pour des pages distinctes avec des informations liées à chaque destination, par exemple "example.com/destination/venice". /activities/» et «example.com/destination/venice/attractions/ ».
Si vous souhaitez savoir comment ajouter des points de terminaison à la page "Mon compte" de WooCommerce, j’ai un autre article à ce sujet !
L’API WordPress Rewrite propose de nombreuses fonctions utiles pour écrire vos propres règles d’URL personnalisées. Vous avez peut-être vu la fonction la plus connue et la plus large ; add_rewrite_rule()
. Ce tutoriel utilise cependant le similar add_rewrite_endpoint()
, qui est très utile pour ajouter des "endpoints" d’URL (en gros, ajouter des slugs d’URL personnalisés après quelque chose qui existe déjà, par exemple après la fin d’un seul article ou d’une seule catégorie). Vous pouvez obtenir le même résultat en utilisant add_rewrite_rule()
mais le processus d’ajout de points de terminaison est plus simple.
Ce que nous ferons
Ce guide supposera que nous avons créé deux types de publication personnalisés ; ‘film’ et ‘acteur’. La règle du permalien pour un seul film est "example.com/movie/fight-club/" et pour un seul acteur "example.com/actor/brad-pitt/". Nous voulons une page distincte pour chaque film qui montre tous les acteurs de ce film, située à "example.com/movie/fight-club/actors/" et de même une page distincte pour chaque acteur qui montre tous les films dans lesquels l’acteur a été, situé sur "example.com/actor/brad-pitt/movies/".
Je n’entrerai pas dans les détails sur la façon d’ajouter ces deux types de publication personnalisés ; Si vous avez besoin d’aide pour cette partie, je vous recommande de lire mon article sur la façon d’ajouter des types de publication personnalisés.
Ecrire le code
La première étape consiste à appeler add_rewrite_endpoint()
une fonction accrochée à init
(généralement, toutes les fonctions de l’API Rewrite sont accrochées à init
). pour enregistrer nos deux points finaux souhaités ; ‘films’ et ‘acteurs’. La fonction prend deux arguments ; d’abord le point de terminaison que vous voulez (par exemple ‘films’), et deuxièmement une constante pour l’endroit où le point de terminaison doit "vivre" (par exemple pages, auteur, archives, etc.). Regardez la documentation pour quelles constantes vous pouvez utiliser ; comme pour cet exemple, le général EP_PERMALINK
va bien:
add_action('init', function() {
add_rewrite_endpoint('movies', EP_PERMALINK);
add_rewrite_endpoint('actors', EP_PERMALINK);
});
NB : Si votre type de publication personnalisé est hiérarchique, ce qui signifie qu’il a 'hierarchical' => true
dans son register_post_type()
, vous devez désactiver la constante EP_PERMALINK
avec EP_PAGES
.
Après avoir enregistré ce code, vous devez aller dans Paramètres> Permaliens et cliquer simplement sur le bouton Enregistrer pour actualiser les permaliens. Chaque fois que vous ajoutez ou modifiez une règle de réécriture, vous devez actualiser vos permaliens pour que cela fonctionne !
Gestion des variables de requête
La façon dont vous, en tant que développeur de thème ou de plug-in, pouvez déterminer si vous souhaitez ou non afficher les modèles pour ces points de terminaison, est de vérifier «query vars» ; essentiellement l’objet de requête global de WordPress. Nous faisons cela en appelant get_query_var()
avec la requête comme argument (‘films’ ou ‘acteurs’).
Si vous avez travaillé avec add_rewrite_rule()
ou get_query_var()
avant, vous savez peut-être déjà que WordPress n’ajoute pas automatiquement les variables de requête personnalisées. Habituellement, vous devez filtrer query_vars
et ajouter vos variables personnalisées afin que WordPress les remplisse. Cependant add_rewrite_endpoint()
le fait automatiquement pour nous.
Cependant, si nous essayons de l’appeler get_query_var('movies')
, il ne semblera jamais être défini. C’est parce qu’il suppose qu’il doit avoir une valeur pour être défini. Les règles de point de terminaison supposent que tout ce qui vient après le point de terminaison est la valeur. Par exemple, "example.com/actor/brad-pitt/movies/some-value/" fonctionnerait, car sur cette page get_query_var('movies')
renverrait la valeur "some-value". Mais ce n’est pas ce que nous voulons, nous voulons que cela fonctionne avec le seul point de terminaison. Pour résoudre ce problème, nous devons nous connecter au request
filtre de WordPress et informer WordPress que si nous sommes à nos points de terminaison, la requête vars doit ajouter le point de terminaison avec une certaine valeur (nous le définissons simplement sur true
).
add_filter('request', function($vars) {
if (isset($vars['movies'])) {
$vars['movies'] = true;
}
if (isset($vars['actors'])) {
$vars['actors'] = true;
}
return $vars;
});
Si vous essayez maintenant d’utiliser get_query_vars('movies')
when at "example.com/actor/brad-pitt/movies/", vous obtiendrez la valeur true
(l’important est qu’elle ait été définie).
Modèle de chargement
L’étape suivante consiste à décider de ce qui doit se passer sur ces deux points de terminaison ; ou en d’autres termes, quels modèles vous souhaitez charger. Cette partie dépend de vous, vous pouvez vous y accrocher, template_redirect
mais ce n’est vraiment recommandé que si vous souhaitez effectuer une redirection réelle. Je recommande de s’accrocher au template_include
filtre et d’indiquer simplement à WordPress quels modèles utiliser lorsque nous sommes à nos points de terminaison personnalisés. Supposons que le thème ait les modèles PHP single-actor-movies.php
pour "example.com/actor//movies/ et single-movie-actors.php
pour "example.com/movie//actors/".
add_filter('template_include', function($template) {
if (is_singular() && get_query_var('movies')) {
$post = get_queried_object();
return locate_template(['single-actor-movies.php']);
}
if (is_singular() && get_query_var('actors')) {
$post = get_queried_object();
return locate_template(['single-movie-actors.php']);
}
return $template;
});
Avec ce filtre en place, WordPress devrait charger les modèles fournis pour nos points de terminaison personnalisés, et dans ces modèles, l’ $post
objet global serait l’objet de publication unique associé avant le point de terminaison – par exemple, l’objet de publication d’acteur unique lorsque nous sommes au modèle pour afficher tout films dans lesquels l’acteur est apparu. Cela nous permet d’interroger facilement les informations que nous voulons montrer.
Obtenir l’URL de votre point de terminaison
Avoir nos points de terminaison et nos pages personnalisés est très bien, mais quelque part, vous auriez besoin de créer un lien vers ceux-ci. Par exemple, dans le modèle de film unique, vous souhaitez un lien "Voir tous les acteurs" qui mène à votre point de terminaison.
Malheureusement, il n’existe pas de fonction WordPress aussi simple pour cela. Vous devrez créer l’URL vous-même. Je recommande d’utiliser [get_site_url](https://developer.wordpress.org/reference/functions/get_site_url/)()
pour les points de terminaison à l’échelle du site, ou dans le cas ci-dessus, vous feriez référence à une publication spécifique avec [get_the_permalink](https://developer.wordpress.org/reference/functions/get_the_permalink/)()
(soit à l’intérieur de la boucle, soit en fournissant un ID de publication) et en ajoutant le point de terminaison après celui-ci, comme ceci :
echo get_the_permalink(). '/actors';