{"id":230992,"date":"2022-12-10T14:55:00","date_gmt":"2022-12-10T11:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230992"},"modified":"2022-12-07T12:07:42","modified_gmt":"2022-12-07T09:07:42","slug":"uma-alternativa-ao-gancho-template_redirect-do-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/uma-alternativa-ao-gancho-template_redirect-do-wordpress\/","title":{"rendered":"Uma alternativa ao gancho template_redirect do WordPress"},"content":{"rendered":"\n<p>A maior parte do trabalho que fa\u00e7o agora se concentra em plugins ou utilit\u00e1rios personalizados que funcionam em cima do WordPress.<\/p>\n<p>Se voc\u00ea conceituar quantos dos projetos que eu construo s\u00e3o reunidos, voc\u00ea revisaria o WordPress (e tudo o que isso implica) como base, e ent\u00e3o o c\u00f3digo tem uma camada que se comunica com o WordPress e que pode se comunicar com APIs de terceiros.<\/p>\n<p>Ao fazer isso, por\u00e9m, geralmente h\u00e1 um componente de front-end que exige que eu renderize informa\u00e7\u00f5es em modelos. Embora a constru\u00e7\u00e3o de templates para WordPress n\u00e3o seja inerentemente dif\u00edcil (embora eu deseje ter um pouco mais do que tags de template \u2013 como um mecanismo de template, esse \u00e9 outro post), acho que vale a pena olhar para algumas maneiras de lidar com customiza\u00e7\u00e3o templates que juntamos com plugins.<\/p>\n<p>Uma das primeiras perguntas que muitas vezes s\u00e3o levantadas com essa declara\u00e7\u00e3o, no entanto, \u00e9<\/p>\n<blockquote>\n<p>Por que voc\u00ea incluiria modelos personalizados em um plugin?<\/p>\n<\/blockquote>\n<p>E eu entendo isso em alguns n\u00edveis.<\/p>\n<ol>\n<li>Manter templates em um plugin borra um pouco as linhas entre temas e plugins, especialmente quando voc\u00ea deixa temas para apresenta\u00e7\u00e3o e plugins para l\u00f3gica de neg\u00f3cios,<\/li>\n<li>Pedir aos usu\u00e1rios que copiem arquivos de tema de um local para outro \u00e9 uma experi\u00eancia ruim para o usu\u00e1rio.<\/li>\n<\/ol>\n<p>Mas h\u00e1 algumas refuta\u00e7\u00f5es ou talvez exce\u00e7\u00f5es definitivas para os casos acima.<\/p>\n<h2>Gancho template_redirect do WordPress<\/h2>\n<p>Antes de falar sobre o gancho <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a> do WordPress, quero falar um pouco sobre os pontos mencionados acima.<\/p>\n<h3>1 Modelos em Plugins<\/h3>\n<p>Se voc\u00ea estiver criando um plug-in personalizado que fa\u00e7a interface com o WordPress e uma API de terceiros ou que use algum tipo de combina\u00e7\u00e3o de reposit\u00f3rios, f\u00e1bricas, modelos e visualiza\u00e7\u00f5es, voc\u00ea precisar\u00e1 exibir essas informa\u00e7\u00f5es na frente -end, e precisa ser independente do tema.<\/p>\n<p>Isso n\u00e3o significa que algu\u00e9m n\u00e3o possa estilizar os elementos da p\u00e1gina ou incluir o modelo em seu trabalho, mas significa que o plug-in deve fornecer um n\u00edvel b\u00e1sico de informa\u00e7\u00e3o que \u00e9 renderizado ao usu\u00e1rio.<\/p>\n<h3>2 Pedir aos usu\u00e1rios para copiar arquivos \u00e9 ruim<\/h3>\n<p>Lembre-se do slogan que a Apple uma vez e muitas vezes divulgou como &#8221; <strong><a href=\"http:\/\/macdailynews.com\/2017\/12\/19\/at-tim-cooks-apple-steve-jobs-is-long-gone-and-so-is-the-it-just-works-ethos\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Simplesmente funciona?<\/a><\/strong> &quot; Mesmo que n\u00e3o seja algo que eles falam tanto quanto antes (se \u00e9 que mais), eu gosto da ideia de ter &quot;apenas trabalho&quot; para o usu\u00e1rio, e \u00e9 algo que eu tento me esfor\u00e7ar no meu trabalhar.<\/p>\n<p>Portanto, quando se trata de criar modelos ou visualiza\u00e7\u00f5es personalizadas para plugins, n\u00e3o quero pedir ao usu\u00e1rio que copie arquivos. Eu s\u00f3 quero que eles:<\/p>\n<ol>\n<li>instale o plug-in,<\/li>\n<li>clique em ativar.<\/li>\n<\/ol>\n<p>E \u00e9 isso. O resto deve ser auto-evidente ou bem documentado.<\/p>\n<h2>De volta ao gancho<\/h2>\n<p>Ok, ent\u00e3o vamos supor por um momento que n\u00f3s constru\u00edmos um plugin, o plugin inclui v\u00e1rios templates b\u00e1sicos (ou visualiza\u00e7\u00f5es dependendo da linguagem que voc\u00ea usa) e que os templates precisam ser escritos na raiz do diret\u00f3rio do tema ativo.<\/p>\n<p>Voc\u00ea pode usar o gancho <strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a><\/strong> (e muitos plugins populares fazem isso). Voc\u00ea pode ler mais sobre isso aqui, mas a ess\u00eancia \u00e9 a seguinte:<\/p>\n<blockquote>\n<p>Esse gancho de a\u00e7\u00e3o \u00e9 executado logo antes do WordPress determinar qual p\u00e1gina de modelo carregar. \u00c9 um bom gancho para usar se voc\u00ea precisar fazer um redirecionamento com pleno conhecimento do conte\u00fado que foi consultado.<\/p>\n<\/blockquote>\n<p>E, para ser claro, n\u00e3o estou dissuadindo o uso deste gancho. Estou apenas oferecendo uma alternativa. E \u00e9 isso (como deve funcionar da seguinte forma):<\/p>\n<ol>\n<li>ativar o plug-in,<\/li>\n<li>localize o tema ativo,<\/li>\n<li>se eles ainda n\u00e3o existirem, copie os arquivos de modelo do plugin para o diret\u00f3rio raiz do tema ativo<\/li>\n<\/ol>\n<p>A etapa final \u00e9 cr\u00edtica porque, se os arquivos de modelo existirem, \u00e9 importante n\u00e3o sobrescrev\u00ea-los principalmente porque o usu\u00e1rio pode ter escrito suas personaliza\u00e7\u00f5es.<\/p>\n<p>Com isso dito, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/04887ee3a384f10ce6eac00d52e2dfb8#file-00-copy-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">veja como voc\u00ea pode fazer isso em uma \u00fanica fun\u00e7\u00e3o<\/a><\/strong> (completa com coment\u00e1rios para mostrar o que voc\u00ea est\u00e1 usando).<\/p>\n<pre><code>&lt;?php\n\nadd_action('plugins_loaded', __NAMESPACE__. 'acmeCopyTemplates');\n\/**\n * Copies the template files from the `assets\/templates` directory to the root directory \n * of the currently active theme (if they do not already exist).\n *\/\nfunction acmeCopyTemplates()\n{\n    \/\/ Find the currently active theme.\n    $activeThemeDir = get_template_directory();\n\n    \/**\n     * Read all of the template files from assets\/templates into an array but\n     * exclude the '.' and the '..' from the array.\n     *\/\n    $templates = array_slice(scandir(dirname(__FILE__).'\/assets\/templates'), 2);\n\n    \/**\n     * Now copy all of these files to the active theme directory.\n     * If the file already exists, then don't do it.\n     *\/\n    foreach ($templates as $template) {\n        if (!file_exists($destination = trailingslashit($activeThemeDir).$template)) {\n            continue;\n        }\n\n        $source = dirname(__FILE__).'\/assets\/templates\/'.$template;\n        $destination = trailingslashit($activeThemeDir).$template;\n\n        copy($source, $destination);\n    }\n}\n<\/code><\/pre>\n<p>Observe que isso usa v\u00e1rias fun\u00e7\u00f5es do PHP. Nomeadamente:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.array-slice.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_slice<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.scandir.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">scandir<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.dirname.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dirname<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.file-exists.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o arquivo existe<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.copy.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">c\u00f3pia de<\/a><\/strong><\/li>\n<\/ul>\n<p>Tudo o que eu acho que \u00e9 \u00fatil e importante saber, independentemente da natureza em que voc\u00ea est\u00e1 usando.<\/p>\n<h2>Os hosts suportam isso?<\/h2>\n<p>Alguns anfitri\u00f5es sim. Eu sei que hosts como <strong><a href=\"https:\/\/wpengine.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o WPEngine<\/a><\/strong> n\u00e3o e isso tamb\u00e9m n\u00e3o \u00e9 uma cr\u00edtica ao host. Alguns fazem isso por raz\u00f5es de seguran\u00e7a; outros permitem, mas isso n\u00e3o significa que sejam menos seguros \u2013 significa apenas que t\u00eam sua infraestrutura configurada de forma diferente.<\/p>\n<p>Em \u00faltima an\u00e1lise, isso mostra que existem outras maneiras de disponibilizar modelos para os usu\u00e1rios quando um plug-in est\u00e1 sendo usado, mas n\u00e3o \u00e9 a \u00fanica maneira e nem sempre funciona.<\/p>\n<p>No entanto, ter op\u00e7\u00f5es \u00e9 bom, especialmente se voc\u00ea preferir uma arquitetura espec\u00edfica em seu plugin em vez de outra.<\/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>Quando se trata de criar modelos personalizados para plugins, quero que eles funcionem e aqui est\u00e1 uma alternativa \u00e0 fun\u00e7\u00e3o template_redirect do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236109,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,806,867],"tags":[1170],"class_list":["post-230992","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230992","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=230992"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230992\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236109"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}