{"id":231526,"date":"2022-12-23T11:01:00","date_gmt":"2022-12-23T08:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231526"},"modified":"2022-12-07T10:47:58","modified_gmt":"2022-12-07T07:47:58","slug":"incluindo-modelos-personalizados-em-nossos-plugins-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/incluindo-modelos-personalizados-em-nossos-plugins-wordpress\/","title":{"rendered":"Incluindo modelos personalizados em nossos plugins WordPress"},"content":{"rendered":"\n<p>Eu acho que um dos aspectos mais subestimados &#8211; ou talvez um dos aspectos raramente discutidos do desenvolvimento de plugins personalizados &#8211; \u00e9 a capacidade de incluir modelos personalizados em nossos plugins do WordPress.<\/p>\n<p>E, para ser honesto, eu entendo: eu sou uma pessoa bastante firme sobre o que deve ser um plugin e o que deve ser um tema.<\/p>\n<p>Aquilo \u00e9:<\/p>\n<ul>\n<li>os temas s\u00e3o para apresenta\u00e7\u00e3o,<\/li>\n<li>plugins s\u00e3o funcionalidades.<\/li>\n<\/ul>\n<p>Se eu incluir templates em um plugin, n\u00e3o estou fazendo a mesma coisa que quando os desenvolvedores incluem funcionalidades em seus temas?<\/p>\n<p>Tal como acontece com tantas coisas em desenvolvimento, acho que depende. Quero dizer, adicionar muitas funcionalidades que prendem voc\u00ea em um tema \u00e9 algo que eu n\u00e3o sou f\u00e3. Da mesma forma, se voc\u00ea tem um plug-in destinado a mostrar dados no front-end e \u00e9 independente do tema, faz sentido.<\/p>\n<p>Ent\u00e3o voc\u00ea tem que ser criterioso em suas decis\u00f5es.<\/p>\n<p>Independentemente disso, h\u00e1 um conjunto comum de etapas que podemos usar ao incluir modelos personalizados em nossos plugins do WordPress.<\/p>\n<p>E \u00e9 isso que este post vai mostrar.<\/p>\n<p>Se voc\u00ea for incluir modelos personalizados no plug-in, assumirei que voc\u00ea est\u00e1 usando modelos \u00fanicos e de arquivo. Caso contr\u00e1rio, use apenas os ganchos e o c\u00f3digo abaixo que voc\u00ea precisa.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160512-61e70bad43f3a.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-160512-61e70bad43f3a.png\" alt=\"Incluindo modelos personalizados em nossos plugins WordPress\" ><\/a><\/p>\n<p>Para ambos, por\u00e9m, conhe\u00e7a estes:<\/p>\n<ul>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/single_template\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">modelo_\u00fanico<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Filter_Reference\/archive_template\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">arquivo_modelo<\/a><\/li>\n<\/ul>\n<p>Usando esses ganchos, voc\u00ea pode informar ao WordPress onde os modelos personalizados residem em seu plug-in.<\/p>\n<h3>Modelos de organiza\u00e7\u00e3o<\/h3>\n<p>Para mim, geralmente tenho um\u00a0 diret\u00f3rio de <strong>modelos<\/strong> no meu plugin que sites no mesmo n\u00edvel dos\u00a0 diret\u00f3rios <strong>assets, src<\/strong> e <strong>vendor<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160512-61e70bb112f53.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-160512-61e70bb112f53.png\" alt=\"Incluindo modelos personalizados em nossos plugins WordPress\" ><\/a><\/p>\n<p>Isso facilita saber onde eles residem e fornece uma maneira consistente de inclu\u00ed-los em todos os plugins que voc\u00ea criou. Afinal, h\u00e1 algo a ser dito para ser consistente nas conven\u00e7\u00f5es que usamos.<\/p>\n<h3>Incluindo os modelos<\/h3>\n<p>Supondo que voc\u00ea tenha\u00a0 o modelo <strong>single-acme.php<\/strong> e o modelo <strong>archive-acme.php<\/strong>, \u00e9 f\u00e1cil inclu\u00ed-lo. E embora eu seja mais f\u00e3 de usar programa\u00e7\u00e3o orientada a objetos, mostrarei como incluir esses modelos usando c\u00f3digo procedural.<\/p>\n<p>\u00c9 f\u00e1cil converter esse c\u00f3digo em c\u00f3digo orientado a objetos, se voc\u00ea quiser. Al\u00e9m disso, vou assumir que voc\u00ea est\u00e1 incluindo isso para tipos de postagem personalizados tamb\u00e9m.<\/p>\n<p>Voc\u00ea sempre pode omitir uma condicional para um tipo de postagem personalizado se quiser simplesmente incluir esses modelos, mas, na minha experi\u00eancia, acho raro que essas situa\u00e7\u00f5es n\u00e3o usem tipos de postagem personalizados, mas n\u00e3o conhe\u00e7o sua situa\u00e7\u00e3o.<\/p>\n<p>Dito isso, aqui est\u00e1 o c\u00f3digo.<\/p>\n<h4>Definindo Ganchos<\/h4>\n<p>Primeiro, precisamos definir os ganchos. Isso \u00e9 relativamente simples, pois usaremos os ganchos descritos acima.<\/p>\n<p>Primeiro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-02-single-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o modelo \u00fanico<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('single_template', 'acmeIncludeSingleTemplate');\n\/**\n * Includes a custom, single template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeSingleTemplate($originalTemplate)\n{\n   \/\/ More to come...\n}<\/code><\/pre>\n<p>E ent\u00e3o <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-03-archive-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o modelo de arquivo<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('archive_template', 'acmeIncludeArchiveTemplate');\n\/**\n * Includes a custom, archive template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalArchiveTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeArchiveTemplate($originalArchiveTemplate)\n{\n  \/\/ More to come...\n}<\/code><\/pre>\n<p>E agora podemos implementar o c\u00f3digo para cada uma das fun\u00e7\u00f5es.<\/p>\n<h4>Adicionando o c\u00f3digo<\/h4>\n<p>Ent\u00e3o, primeiro, vamos olhar para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-00-acme-single-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o modelo \u00fanico<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('single_template', 'acmeIncludeSingleTemplate');\n\/**\n * Includes a custom, single template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeSingleTemplate($originalTemplate)\n{\n  $singleTemplate = plugin_dir_path(\n    dirname(\n      __DIR__) );\n  $singleTemplate .= '\/templates\/single-acme.php';\n\n  if ('acme-cpt' === get_post_type(get_the_ID())) {\n      if (file_exists($singleTemplate)) {\n          return $singleTemplate;\n      }\n  }\n\n  return $originalTemplate;\n}<\/code><\/pre>\n<p>E agora <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5d555468c2c5b3448e5bb0ed6f666f6f#file-01-acme-archive-template-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o modelo de arquivo<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('archive_template', 'acmeIncludeArchiveTemplate');\n\/**\n * Includes a custom, archive template as included in a plugin. If\n * the template is being viewed for a custom post type then use it;\n * otherwise, use the template that's provided by WordPress at runtime.\n *\n * @param  string $originalArchiveTemplate the path to the original template\n *\n * @return string the path to the original template or the custom template.\n *\/\nfunction acmeIncludeArchiveTemplate($originalArchiveTemplate)\n{\n  $archiveTemplate = plugin_dir_path(\n    dirname(\n      __DIR__) );\n  $archiveTemplate .= '\/templates\/archive-acme.php';\n\n  if ('acme-cpt' === get_post_type(get_the_ID())) {\n      if (file_exists($archiveTemplate)) {\n          return $archiveTemplate;\n      }\n  }\n\n  return $originalArchiveTemplate;\n}<\/code><\/pre>\n<p>Se voc\u00ea prestou muita aten\u00e7\u00e3o ao c\u00f3digo, sabe que h\u00e1 muito pouca diferen\u00e7a. Na verdade, o processo geral pode ser descrito da seguinte forma:<\/p>\n<ol>\n<li>definir o gancho,<\/li>\n<li>localize o modelo,<\/li>\n<li>verifique o tipo de postagem personalizado,<\/li>\n<li>o modelo existe, use-o<\/li>\n<li>caso contr\u00e1rio, use o modelo padr\u00e3o<\/li>\n<\/ol>\n<p>E este \u00e9 o processo para modelos \u00fanicos e de arquivo.<\/p>\n<h3>Escrevendo Modelos Compat\u00edveis<\/h3>\n<p>E, finalmente, e isso \u00e9 importante, especialmente se voc\u00ea deseja tornar o modelo o mais agn\u00f3stico poss\u00edvel, tento usar o m\u00e1ximo poss\u00edvel de tags de modelo do WordPress integradas ao mostrar o conte\u00fado relacionado ao plug-in. Isso permite que os desenvolvedores de temas o estilizem facilmente para se adequar ao seu tema.<\/p>\n<p>N\u00e3o, voc\u00ea n\u00e3o poder\u00e1 acomodar todos os temas, mas essa \u00e9 a natureza dos temas do WordPress. O objetivo \u00e9 ter o m\u00e1ximo de trabalho poss\u00edvel para recuperar e renderizar dados do modelo para que os desenvolvedores front-end possam gerenci\u00e1-los facilmente.<\/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 um conjunto comum de etapas que podemos usar ao incluir modelos personalizados em nossos plugins do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":236054,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,837,806,846,867],"tags":[1170],"class_list":["post-231526","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-guia-para-iniciantes","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231526","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=231526"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/231526\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/236054"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=231526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=231526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=231526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}