{"id":230605,"date":"2022-11-30T17:12:00","date_gmt":"2022-11-30T14:12:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230605"},"modified":"2022-11-09T23:10:11","modified_gmt":"2022-11-09T20:10:11","slug":"regras-de-reescrita-personalizadas-e-modelos-de-pagina-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/regras-de-reescrita-personalizadas-e-modelos-de-pagina-no-wordpress\/","title":{"rendered":"Regras de reescrita personalizadas e modelos de p\u00e1gina no WordPress"},"content":{"rendered":"\n<p>A API do WordPress <strong><a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rewrite<\/a><\/strong> \u00e9 uma API s\u00f3lida, supondo que voc\u00ea esteja confort\u00e1vel com express\u00f5es regulares.<\/p>\n<p>E, honestamente, mesmo se voc\u00ea n\u00e3o for, ferramentas como <strong><a href=\"https:\/\/www.phpliveregex.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Live RegEx<\/a><\/strong> tornam muito f\u00e1cil testar seu c\u00f3digo antes de coloc\u00e1-lo na <code>add_rewrite_rule<\/code>chamada da 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=\"Regras de reescrita personalizadas e modelos de p\u00e1gina no WordPress\" ><\/a><\/p>\n<p>No entanto, h\u00e1 momentos em que voc\u00ea pode se encontrar em uma situa\u00e7\u00e3o em que precisa trabalhar com regras de reescrita e modelos de p\u00e1gina. E quando esse \u00e9 o caso, nem sempre \u00e9 t\u00e3o simples quanto fazer uma simples chamada com uma \u00fanica express\u00e3o regular.<\/p>\n<p>A raz\u00e3o? Se voc\u00ea tiver v\u00e1rias p\u00e1ginas usando o mesmo modelo, nem sempre ter\u00e1 a p\u00e1gina localizada no mesmo \u00edndice na consulta executada em cada p\u00e1gina.<\/p>\n<p>Para isso, temos que lidar com isso de uma maneira um pouco diferente de, digamos, simplesmente acessar um \u00edndice num\u00e9rico de informa\u00e7\u00f5es na consulta global.<\/p>\n<h2>Regras de reescrita e modelos de p\u00e1gina<\/h2>\n<p>Primeiro, vamos supor que temos dois modelos (que n\u00e3o est\u00e3o em ordem espec\u00edfica):<\/p>\n<ol>\n<li>template-alpha.php<\/li>\n<li>template-beta.php<\/li>\n<\/ol>\n<p>E ent\u00e3o digamos que queremos configurar um URL personalizado para p\u00e1ginas que usam um desses modelos.<\/p>\n<p>Isso se dividiria nas seguintes etapas:<\/p>\n<ol>\n<li>Iterar pelas postagens na consulta,<\/li>\n<li>Armazene a postagem usando o modelo em sua respectiva matriz,<\/li>\n<li>Configure as regras de reescrita para cada postagem com uma determinada consulta.<\/li>\n<\/ol>\n<p>Para este exemplo, manterei as regras de reescrita bem simples. Afinal, express\u00f5es regulares podem ser dif\u00edceis o suficiente para seguir, ent\u00e3o tentar segui-las ao lidar com o objeto Query, v\u00e1rios arrays e manipular as regras pode ser um pouco demais.<\/p>\n<p>Com isso dito, aqui est\u00e1 o c\u00f3digo de exemplo que \u00e9 dividido com base nas etapas acima. No final do post, vou compartilhar um trecho que junta tudo em algumas fun\u00e7\u00f5es separadas para que voc\u00ea possa ver como tudo isso se encaixa.<\/p>\n<p>Com isso dito, veja como lidar com todos os itens acima.<\/p>\n<h3>1 Adicionando Regras de Reescrita<\/h3>\n<p>Primeiro, precisamos ler algumas informa\u00e7\u00f5es do objeto de consulta global do WordPress para encontrar todas as p\u00e1ginas que possuem modelos aplicados a elas.<\/p>\n<p>Para fazer isso, podemos ler as informa\u00e7\u00f5es <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-00-read-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">do objeto de consulta global em uma vari\u00e1vel local<\/a><\/strong>. Isso facilita a fuga do restante do c\u00f3digo se n\u00e3o houver nada com o que trabalhar.<\/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 Armazenar informa\u00e7\u00f5es relevantes em uma matriz<\/h3>\n<p>Assumindo que existem p\u00e1ginas com templates, ent\u00e3o continuaremos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-001-store-templated-pages-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">armazenando cada uma das p\u00e1ginas<\/a><\/strong> em arrays para que possamos gerenciar facilmente suas respectivas regras de reescrita.<\/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>Observe que, acima, fa\u00e7o refer\u00eancia a uma matriz global. Suponha que isso seja simplesmente inicializado como uma matriz vazia no construtor da classe.<\/p>\n<h3>3 Configure as Regras de Reescrita<\/h3>\n<p>Agora que temos dois arrays \u2013 um para cada modelo e as p\u00e1ginas que o cont\u00eam \u2013 podemos iterar por eles e atribuir regras de reescrita para cada uma dessas p\u00e1ginas.<\/p>\n<p>Por exemplo, digamos que para um modelo, digamos alfa, queremos configurar regras de reescrita para os EUA e estados.<\/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\">Aqui est\u00e1 o c\u00f3digo<\/a><\/strong> para<code>template-alpha.php<\/code>:<\/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>E <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-03-acme-id-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqui est\u00e1 o c\u00f3digo<\/a><\/strong> para <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>Claro, as express\u00f5es regulares usadas no c\u00f3digo acima s\u00e3o simplesmente para fins de demonstra\u00e7\u00e3o. O seu ser\u00e1 para o que for necess\u00e1rio para o seu projeto.<\/p>\n<h3>4 Todos Juntos Agora<\/h3>\n<p>\u00c9 importante dividir toda essa funcionalidade em seus pr\u00f3prios m\u00e9todos para que tudo possa ser facilmente encapsulado e testado, se necess\u00e1rio.<\/p>\n<p>Para isso, veja como ficar\u00e1 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-04-final-functions-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o c\u00f3digo completo :<\/a><\/strong><\/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>Lembre-se, por\u00e9m; isso \u00e9 apenas baseado no c\u00f3digo de demonstra\u00e7\u00e3o compartilhado neste post. Quando voc\u00ea est\u00e1 trabalhando em seu projeto, as express\u00f5es regulares, modelos e assim por diante variam.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00e1 momentos em que voc\u00ea pode se encontrar em uma situa\u00e7\u00e3o em que precisa trabalhar com regras de reescrita e modelos de p\u00e1gina.<\/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":[898,722,846,867],"tags":[1170],"class_list":["post-230605","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230605"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230605\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/163544"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}