{"id":230479,"date":"2022-11-30T17:01:00","date_gmt":"2022-11-30T14:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230479"},"modified":"2022-11-09T22:34:24","modified_gmt":"2022-11-09T19:34:24","slug":"regles-de-reecriture-personnalisees-et-modeles-de-page-dans-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/regles-de-reecriture-personnalisees-et-modeles-de-page-dans-wordpress\/","title":{"rendered":"R\u00e8gles de r\u00e9\u00e9criture personnalis\u00e9es et mod\u00e8les de page dans WordPress"},"content":{"rendered":"\n<p>L&rsquo;API WordPress <strong><a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rewrite<\/a><\/strong> est une API solide en supposant que vous \u00eates \u00e0 l&rsquo;aise avec les expressions r\u00e9guli\u00e8res.<\/p>\n<p>Et, honn\u00eatement, m\u00eame si vous ne l&rsquo;\u00eates pas, des outils comme <strong><a href=\"https:\/\/www.phpliveregex.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Live RegEx<\/a><\/strong> permettent de tester tr\u00e8s facilement votre code avant de le d\u00e9poser dans l&rsquo; <code>add_rewrite_rule<\/code>appel API.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163543-61e7543bc96ee.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163543-61e7543bc96ee.png\" alt=\"R\u00e8gles de r\u00e9\u00e9criture personnalis\u00e9es et mod\u00e8les de page dans WordPress\" ><\/a><\/p>\n<p>Cependant, il peut arriver que vous vous trouviez dans une situation o\u00f9 vous devez travailler avec des r\u00e8gles de r\u00e9\u00e9criture et des mod\u00e8les de page. Et lorsque c&rsquo;est le cas, ce n&rsquo;est pas toujours aussi simple que de faire un simple appel avec une seule expression r\u00e9guli\u00e8re.<\/p>\n<p>La raison? Si vous avez plusieurs pages utilisant le m\u00eame mod\u00e8le, la page ne sera pas toujours situ\u00e9e dans le m\u00eame index dans la requ\u00eate qui s&rsquo;ex\u00e9cute sur chaque page.<\/p>\n<p>\u00c0 cette fin, nous devons le g\u00e9rer d&rsquo;une mani\u00e8re l\u00e9g\u00e8rement diff\u00e9rente que, disons, en acc\u00e9dant simplement \u00e0 un index num\u00e9rique d&rsquo;informations dans la requ\u00eate globale.<\/p>\n<h2>R\u00e9\u00e9crire les r\u00e8gles et les mod\u00e8les de page<\/h2>\n<p>Supposons d&rsquo;abord que nous ayons deux mod\u00e8les (qui ne sont pas dans un ordre particulier)\u00a0:<\/p>\n<ol>\n<li>template-alpha.php<\/li>\n<li>template-beta.php<\/li>\n<\/ol>\n<p>Et puis disons que nous voulons configurer une URL personnalis\u00e9e pour les pages dont chacune utilise l&rsquo;un de ces mod\u00e8les.<\/p>\n<p>Cela se d\u00e9composerait en les \u00e9tapes suivantes :<\/p>\n<ol>\n<li>Parcourez les messages de la requ\u00eate,<\/li>\n<li>Stockez le message en utilisant le mod\u00e8le dans son tableau respectif,<\/li>\n<li>Configurez les r\u00e8gles de r\u00e9\u00e9criture pour chaque message ayant une requ\u00eate donn\u00e9e.<\/li>\n<\/ol>\n<p>Pour cet exemple, je garderai les r\u00e8gles de r\u00e9\u00e9criture assez simples. Apr\u00e8s tout, les expressions r\u00e9guli\u00e8res peuvent \u00eatre assez difficiles \u00e0 suivre, donc essayer de les suivre tout en traitant l&rsquo;objet Query, plusieurs tableaux et la gestion des r\u00e8gles peut \u00eatre un peu trop.<\/p>\n<p>Cela dit, voici un exemple de code d\u00e9compos\u00e9 en fonction des \u00e9tapes ci-dessus. \u00c0 la fin de l&rsquo;article, je partagerai un extrait qui regroupe tout dans quelques fonctions distinctes afin que vous puissiez voir comment tout cela s&#8217;embo\u00eete.<\/p>\n<p>Cela dit, voici comment g\u00e9rer tout ce qui pr\u00e9c\u00e8de.<\/p>\n<h3>1 Ajout de r\u00e8gles de r\u00e9\u00e9criture<\/h3>\n<p>Tout d&rsquo;abord, nous devons lire certaines informations de l&rsquo;objet de requ\u00eate WordPress global pour trouver toutes les pages auxquelles des mod\u00e8les sont appliqu\u00e9s.<\/p>\n<p>Pour ce faire, nous pouvons lire les informations <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-00-read-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de l&rsquo;objet de requ\u00eate global dans une variable locale<\/a><\/strong>. Cela facilite l&rsquo;\u00e9vitement du reste du code s&rsquo;il n&rsquo;y a rien avec quoi travailler.<\/p>\n<pre><code>&lt;?php \n\n$query = $this-&gt;query-&gt;query([\n    'post_type' =&gt; 'page',\n    'meta_key' =&gt; '_wp_page_template',\n    'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n]);\n\nif (!$query) {\n    return;\n}\n\n\/\/ More to come...\n<\/code><\/pre>\n<h3>2 Stocker les informations pertinentes dans un tableau<\/h3>\n<p>En supposant qu&rsquo;il existe des pages ayant des mod\u00e8les, nous allons proc\u00e9der au <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-001-store-templated-pages-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">stockage de chacune des pages<\/a><\/strong> dans des tableaux afin de pouvoir g\u00e9rer facilement leurs r\u00e8gles de r\u00e9\u00e9criture respectives.<\/p>\n<pre><code>&lt;?php\n\nforeach ($query as $post) {\n    $slug = get_page_template_slug($post-&gt;ID);\n\n    if ('template-alpha.php' === $slug) {\n        $this-&gt;alphaPages[] = $post;\n    }\n\n    if ('template-find-a-camp.php' === $slug) {\n        $this-&gt;betaPages[] = $post;\n    }\n}\n<\/code><\/pre>\n<p>Notez que dans ce qui pr\u00e9c\u00e8de, je fais r\u00e9f\u00e9rence \u00e0 un tableau global. Supposons que cela soit simplement initialis\u00e9 en tant que tableau vide dans le constructeur de la classe.<\/p>\n<h3>3 Configurer les r\u00e8gles de r\u00e9\u00e9criture<\/h3>\n<p>Maintenant que nous avons deux tableaux &#8211; un pour chaque mod\u00e8le et les pages qui le contiennent &#8211; nous pouvons les parcourir et attribuer des r\u00e8gles de r\u00e9\u00e9criture pour chacune de ces pages.<\/p>\n<p>Par exemple, disons que pour un mod\u00e8le, disons alpha, nous voulons configurer des r\u00e8gles de r\u00e9\u00e9criture pour les \u00c9tats-Unis et les \u00c9tats.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-02-country-state-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Voici le code<\/a><\/strong> pour<code>template-alpha.php<\/code>\u00a0:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%country%', '([^&amp;]+)');\nadd_rewrite_tag('%state%', '([^&amp;]+)');\n\nforeach ($this-&gt;alphaPages as $post) {\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n        'top'\n    );\n\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Et <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-03-acme-id-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voici le code<\/a><\/strong> pour <code>template-beta.php<\/code>:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\nforeach ($this-&gt;betaPages as $post) {\n    add_rewrite_rule(\n        '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Bien s\u00fbr, les expressions r\u00e9guli\u00e8res utilis\u00e9es dans le code ci-dessus sont simplement \u00e0 des fins de d\u00e9monstration. Le v\u00f4tre sera pour tout ce qui est n\u00e9cessaire \u00e0 votre projet.<\/p>\n<h3>4 Tous ensemble maintenant<\/h3>\n<p>Il est important de diviser toutes ces fonctionnalit\u00e9s en leurs propres m\u00e9thodes afin qu&rsquo;elles puissent toutes \u00eatre facilement encapsul\u00e9es et test\u00e9es, si n\u00e9cessaire.<\/p>\n<p>\u00c0 cette fin, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-04-final-functions-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voici \u00e0 quoi ressemblera le code complet<\/a><\/strong>\u00a0:<\/p>\n<pre><code>&lt;?php\n\npublic function addRewriteRules()\n{\n    $query = $this-&gt;query-&gt;query([\n        'post_type' =&gt; 'page',\n        'meta_key' =&gt; '_wp_page_template',\n        'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n    ]);\n\n    if (!$query) {\n        return;\n    }\n\n    $this-&gt;setPageTypes($query);\n    $this-&gt;setAlphaRewriteRules();\n    $this-&gt;setBetaRewriteRules();\n}\n\nprivate function setPageTypes($query)\n{\n    foreach ($query as $post) {\n        $slug = get_page_template_slug($post-&gt;ID);\n\n        if ('template-alpha.php' === $slug) {\n            $this-&gt;alphaPages[] = $post;\n        }\n\n        if ('template-find-a-camp.php' === $slug) {\n            $this-&gt;betaPages[] = $post;\n        }\n    }\n}\n\nprivate function setAlphaRewriteRules()\n{\n    add_rewrite_tag('%country%', '([^&amp;]+)');\n    add_rewrite_tag('%state%', '([^&amp;]+)');\n\n    foreach ($this-&gt;alphaRules as $post) {\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n            'top'\n        );\n\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n            'top'\n        );\n    }\n}\n\nprivate function setBetaRewriteRules()\n{\n    add_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\n    foreach ($this-&gt;betaPages as $post) {\n        add_rewrite_rule(\n            '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n            'top'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Rappelez-vous, cependant; ceci est juste bas\u00e9 sur le code de d\u00e9monstration partag\u00e9 dans ce post. Lorsque vous travaillez sur votre projet, les expressions r\u00e9guli\u00e8res, les mod\u00e8les, etc. varient.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il peut arriver que vous vous trouviez dans une situation o\u00f9 vous devez travailler avec des r\u00e8gles de r\u00e9\u00e9criture et des mod\u00e8les de page.<\/p>\n","protected":false},"author":1,"featured_media":163544,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,841,862],"tags":[1167],"class_list":["post-230479","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-tutoriels","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230479","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=230479"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/230479\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/163544"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=230479"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=230479"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=230479"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}