Actualités WEB et WordPress, thèmes, plugins. Ici, nous partageons des conseils et les meilleures solutions de sites Web.

Tutoriel : Points de terminaison d’URL personnalisés avec l’API de réécriture de WordPress

13

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_PERMALINKva 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' => truedans son register_post_type(), vous devez désactiver la constante EP_PERMALINKavec 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_varset 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 requestfiltre 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_redirectmais ce n’est vraiment recommandé que si vous souhaitez effectuer une redirection réelle. Je recommande de s’accrocher au template_includefiltre 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.phppour "example.com/actor//movies/ et single-movie-actors.phppour "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’ $postobjet 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';

Source d’enregistrement: awhitepixel.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More