{"id":234249,"date":"2023-02-21T13:42:00","date_gmt":"2023-02-21T10:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=234249"},"modified":"2022-11-12T02:06:49","modified_gmt":"2022-11-11T23:06:49","slug":"tutoriel-points-de-terminaison-durl-personnalises-avec-lapi-de-reecriture-de-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/tutoriel-points-de-terminaison-durl-personnalises-avec-lapi-de-reecriture-de-wordpress\/","title":{"rendered":"Tutoriel\u00a0: Points de terminaison d&rsquo;URL personnalis\u00e9s avec l&rsquo;API de r\u00e9\u00e9criture de WordPress"},"content":{"rendered":"\n<p>Avez-vous d\u00e9j\u00e0 souhait\u00e9 pouvoir \u00e9tendre des publications uniques, des pages ou vos types de publication personnalis\u00e9s avec un mod\u00e8le personnalis\u00e9 qui conserve sa propre structure d&rsquo;URL\u00a0? Avec l&rsquo;API WordPress <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rewrite<\/a>, c&rsquo;est tout \u00e0 fait possible, et pas difficile du tout.<\/p>\n<p>Dans ce didacticiel, nous verrons comment ajouter une vue de type de publication personnalis\u00e9e unique avec un autre slug qui charge un mod\u00e8le diff\u00e9rent. En d&rsquo;autres termes, si un seul type de message personnalis\u00e9 a l&rsquo;URL &quot;example.com\/destination\/venice\/&quot;, vous pouvez ajouter des r\u00e8gles d&rsquo;URL pour des pages distinctes avec des informations li\u00e9es \u00e0 chaque destination, par exemple &quot;example.com\/destination\/venice&quot;. \/activities\/\u00bb et \u00abexample.com\/destination\/venice\/attractions\/ \u00bb.<\/p>\n<p>Si vous souhaitez savoir comment ajouter des points de terminaison \u00e0 la page &quot;Mon compte&quot; de WooCommerce, j&rsquo;ai un <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-custom-endpoints-to-my-account-page-in-woocommerce\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">autre article<\/a> \u00e0 ce sujet\u00a0!<\/p>\n<p>L&rsquo;API WordPress Rewrite propose de nombreuses fonctions utiles pour \u00e9crire vos propres r\u00e8gles d&rsquo;URL personnalis\u00e9es. Vous avez peut-\u00eatre vu la fonction la plus connue et la plus large\u00a0; <code>add_rewrite_rule()<\/code>. Ce tutoriel utilise cependant le similar <code>add_rewrite_endpoint()<\/code>, qui est tr\u00e8s utile pour ajouter des &quot;endpoints&quot; d&rsquo;URL (en gros, ajouter des slugs d&rsquo;URL personnalis\u00e9s apr\u00e8s quelque chose qui existe d\u00e9j\u00e0, par exemple apr\u00e8s la fin d&rsquo;un seul article ou d&rsquo;une seule cat\u00e9gorie). Vous pouvez obtenir le m\u00eame r\u00e9sultat en utilisant <code>add_rewrite_rule()<\/code>mais le processus d&rsquo;ajout de points de terminaison est plus simple.<\/p>\n<h2>Ce que nous ferons<\/h2>\n<p>Ce guide supposera que nous avons cr\u00e9\u00e9 deux types de publication personnalis\u00e9s\u00a0; &lsquo;film&rsquo; et &lsquo;acteur&rsquo;. La r\u00e8gle du permalien pour un seul film est &quot;example.com\/movie\/fight-club\/&quot; et pour un seul acteur &quot;example.com\/actor\/brad-pitt\/&quot;. Nous voulons une page distincte pour chaque film qui montre tous les acteurs de ce film, situ\u00e9e \u00e0 &quot;example.com\/movie\/fight-club\/actors\/&quot; et de m\u00eame une page distincte pour chaque acteur qui montre tous les films dans lesquels l&rsquo;acteur a \u00e9t\u00e9, situ\u00e9 sur &quot;example.com\/actor\/brad-pitt\/movies\/&quot;.<\/p>\n<p>Je n&rsquo;entrerai pas dans les d\u00e9tails sur la fa\u00e7on d&rsquo;ajouter ces deux types de publication personnalis\u00e9s\u00a0; Si vous avez besoin d&rsquo;aide pour cette partie, je vous recommande de lire mon article sur <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-post-types-and-custom-taxonomies\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">la fa\u00e7on d&rsquo;ajouter des types de publication personnalis\u00e9s<\/a>.<\/p>\n<h2>Ecrire le code<\/h2>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 appeler <code>add_rewrite_endpoint()<\/code>une fonction accroch\u00e9e \u00e0 <code>init<\/code>(g\u00e9n\u00e9ralement, toutes les fonctions de l&rsquo;API Rewrite sont accroch\u00e9es \u00e0 <code>init<\/code>). pour enregistrer nos deux points finaux souhait\u00e9s\u00a0; &lsquo;films&rsquo; et &lsquo;acteurs&rsquo;. La <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\/add_rewrite_endpoint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fonction<\/a> prend deux arguments ; d&rsquo;abord le point de terminaison que vous voulez (par exemple &lsquo;films&rsquo;), et deuxi\u00e8mement une constante pour l&rsquo;endroit o\u00f9 le point de terminaison doit &quot;vivre&quot; (par exemple pages, auteur, archives, etc.). Regardez la documentation pour quelles constantes vous pouvez utiliser ; comme pour cet exemple, le g\u00e9n\u00e9ral <code>EP_PERMALINK<\/code>va bien:<\/p>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('movies', EP_PERMALINK);\n    add_rewrite_endpoint('actors', EP_PERMALINK);\n});<\/code><\/pre>\n<p>NB\u00a0: Si votre type de publication personnalis\u00e9 est hi\u00e9rarchique, ce qui signifie qu&rsquo;il a <code>'hierarchical' =&gt; true<\/code>dans son <code>register_post_type()<\/code>, vous devez d\u00e9sactiver la constante <code>EP_PERMALINK<\/code>avec <code>EP_PAGES<\/code>.<\/p>\n<p>Apr\u00e8s avoir enregistr\u00e9 ce code, vous devez aller dans Param\u00e8tres&gt; Permaliens et cliquer simplement sur le bouton Enregistrer pour actualiser les permaliens. Chaque fois que vous ajoutez ou modifiez une r\u00e8gle de r\u00e9\u00e9criture, vous devez actualiser vos permaliens pour que cela fonctionne\u00a0!<\/p>\n<h3>Gestion des variables de requ\u00eate<\/h3>\n<p>La fa\u00e7on dont vous, en tant que d\u00e9veloppeur de th\u00e8me ou de plug-in, pouvez d\u00e9terminer si vous souhaitez ou non afficher les mod\u00e8les pour ces points de terminaison, est de v\u00e9rifier \u00abquery vars\u00bb ; essentiellement l&rsquo;objet de requ\u00eate global de WordPress. Nous faisons cela en appelant <code>get_query_var()<\/code>avec la requ\u00eate comme argument (&lsquo;films&rsquo; ou &lsquo;acteurs&rsquo;).<\/p>\n<p>Si vous avez travaill\u00e9 avec <code>add_rewrite_rule()<\/code>ou <code>get_query_var()<\/code>avant, vous savez peut-\u00eatre d\u00e9j\u00e0 que WordPress n&rsquo;ajoute pas automatiquement les variables de requ\u00eate personnalis\u00e9es. Habituellement, vous devez filtrer <code>query_vars<\/code>et ajouter vos variables personnalis\u00e9es afin que WordPress les remplisse. Cependant <code>add_rewrite_endpoint()<\/code>le fait automatiquement pour nous.<\/p>\n<p>Cependant, si nous essayons de l&rsquo;appeler <code>get_query_var('movies')<\/code>, il ne semblera jamais \u00eatre d\u00e9fini. C&rsquo;est parce qu&rsquo;il suppose qu&rsquo;il doit avoir une valeur pour \u00eatre d\u00e9fini. Les r\u00e8gles de point de terminaison supposent que tout ce qui vient apr\u00e8s le point de terminaison est la valeur. Par exemple, &quot;example.com\/actor\/brad-pitt\/movies\/some-value\/&quot; fonctionnerait, car sur cette page <code>get_query_var('movies')<\/code>renverrait la valeur &quot;some-value&quot;. Mais ce n&rsquo;est pas ce que nous voulons, nous voulons que cela fonctionne avec le seul point de terminaison. Pour r\u00e9soudre ce probl\u00e8me, nous devons nous connecter au <code>request<\/code>filtre de WordPress et informer WordPress que si nous sommes \u00e0 nos points de terminaison, la requ\u00eate vars doit ajouter le point de terminaison avec une certaine valeur (nous le d\u00e9finissons simplement sur <code>true<\/code>).<\/p>\n<pre><code>add_filter('request', function($vars) {\n    if (isset($vars['movies'])) {\n        $vars['movies'] = true;\n    }\n    if (isset($vars['actors'])) {\n        $vars['actors'] = true;\n    }\n    return $vars;\n});<\/code><\/pre>\n<p>Si vous essayez maintenant d&rsquo;utiliser <code>get_query_vars('movies')<\/code>when at &quot;example.com\/actor\/brad-pitt\/movies\/&quot;, vous obtiendrez la valeur <code>true<\/code>(l&rsquo;important est qu&rsquo;elle ait \u00e9t\u00e9 d\u00e9finie).<\/p>\n<h3>Mod\u00e8le de chargement<\/h3>\n<p>L&rsquo;\u00e9tape suivante consiste \u00e0 d\u00e9cider de ce qui doit se passer sur ces deux points de terminaison\u00a0; ou en d&rsquo;autres termes, quels mod\u00e8les vous souhaitez charger. Cette partie d\u00e9pend de vous, vous pouvez vous y accrocher, <code>template_redirect<\/code>mais ce n&rsquo;est vraiment recommand\u00e9 que si vous souhaitez effectuer une redirection r\u00e9elle. Je recommande de s&rsquo;accrocher au <code>template_include<\/code>filtre et d&rsquo;indiquer simplement \u00e0 WordPress quels mod\u00e8les utiliser lorsque nous sommes \u00e0 nos points de terminaison personnalis\u00e9s. Supposons que le th\u00e8me ait les mod\u00e8les PHP <code>single-actor-movies.php<\/code>pour &quot;example.com\/actor\/\/movies\/ et <code>single-movie-actors.php<\/code>pour &quot;example.com\/movie\/\/actors\/&quot;.<\/p>\n<pre><code>add_filter('template_include', function($template) {\n    if (is_singular() &amp;&amp; get_query_var('movies')) {\n        $post = get_queried_object();\n        return locate_template(['single-actor-movies.php']);\n    }\n    if (is_singular() &amp;&amp; get_query_var('actors')) {\n        $post = get_queried_object();\n        return locate_template(['single-movie-actors.php']);\n    }\n    return $template;\n});<\/code><\/pre>\n<p>Avec ce filtre en place, WordPress devrait charger les mod\u00e8les fournis pour nos points de terminaison personnalis\u00e9s, et dans ces mod\u00e8les, l&rsquo; <code>$post<\/code>objet global serait l&rsquo;objet de publication unique associ\u00e9 avant le point de terminaison &#8211; par exemple, l&rsquo;objet de publication d&rsquo;acteur unique lorsque nous sommes au mod\u00e8le pour afficher tout films dans lesquels l&rsquo;acteur est apparu. Cela nous permet d&rsquo;interroger facilement les informations que nous voulons montrer.<\/p>\n<h2>Obtenir l&rsquo;URL de votre point de terminaison<\/h2>\n<p>Avoir nos points de terminaison et nos pages personnalis\u00e9s est tr\u00e8s bien, mais quelque part, vous auriez besoin de cr\u00e9er un lien vers ceux-ci. Par exemple, dans le mod\u00e8le de film unique, vous souhaitez un lien &quot;Voir tous les acteurs&quot; qui m\u00e8ne \u00e0 votre point de terminaison.<\/p>\n<p>Malheureusement, il n&rsquo;existe pas de fonction WordPress aussi simple pour cela. Vous devrez cr\u00e9er l&rsquo;URL vous-m\u00eame. Je recommande d&rsquo;utiliser <code>[get_site_url](https:\/\/developer.wordpress.org\/reference\/functions\/get_site_url\/)()<\/code>pour les points de terminaison \u00e0 l&rsquo;\u00e9chelle du site, ou dans le cas ci-dessus, vous feriez r\u00e9f\u00e9rence \u00e0 une publication sp\u00e9cifique avec <code>[get_the_permalink](https:\/\/developer.wordpress.org\/reference\/functions\/get_the_permalink\/)()<\/code>(soit \u00e0 l&rsquo;int\u00e9rieur de la boucle, soit en fournissant un ID de publication) et en ajoutant le point de terminaison apr\u00e8s celui-ci, comme ceci\u00a0:<\/p>\n<pre><code>echo get_the_permalink(). '\/actors';<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce didacticiel vous montre comment \u00e9tendre votre type de publication personnalis\u00e9 avec un mod\u00e8le personnalis\u00e9 qui conserve sa propre structure d&rsquo;URL, \u00e0 l&rsquo;aide de l&rsquo;API WordPress Rewrite.<\/p>\n","protected":false},"author":1,"featured_media":152349,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,588,717,516,832,1110,506,509,841,515,862],"tags":[1167],"class_list":["post-234249","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-code","category-developpeur","category-software-entwicklung","category-guide-pour-les-debutants","category-n-a","category-ratgeber-fuer-anfaenger","category-tutorials","category-tutoriels","category-wordpress","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=234249"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/234249\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/152349"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=234249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=234249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=234249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}