{"id":230268,"date":"2022-11-23T13:07:00","date_gmt":"2022-11-23T10:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230268"},"modified":"2022-11-09T20:52:57","modified_gmt":"2022-11-09T17:52:57","slug":"modelagem-e-logica-condicional-com-oop-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/modelagem-e-logica-condicional-com-oop-no-wordpress\/","title":{"rendered":"Modelagem e l\u00f3gica condicional com OOP no WordPress"},"content":{"rendered":"\n<p>A modelagem est\u00e1 se tornando mais comum no WordPress, e considero isso uma coisa boa.<\/p>\n<p>Mas isso n\u00e3o significa que n\u00e3o existam projetos que gerenciamos que usem uma abordagem mais tradicional para exibir modelos ou parciais. Al\u00e9m disso, isso tamb\u00e9m n\u00e3o significa que estamos isentos de manter bases de c\u00f3digo que usam c\u00f3digo que n\u00e3o usa um mecanismo de modelagem.<\/p>\n<p>Embora eu ache que modelar \u00e9 bom, n\u00e3o acho que seja sempre necess\u00e1rio. Isso \u00e9 conte\u00fado para outro post, no entanto.<\/p>\n<p>Em vez disso, quero percorrer o processo de usar a l\u00f3gica condicional de exibir ou n\u00e3o uma parcial em um modelo e faz\u00ea-lo usando programa\u00e7\u00e3o orientada a objetos.<\/p>\n<h2>Modelagem e l\u00f3gica condicional com OOP<\/h2>\n<p>Para fazer isso, vamos supor o seguinte:<\/p>\n<ol>\n<li>Temos um plugin que depende de outro plugin para um recurso.<\/li>\n<li>O segundo plugin \u00e9 opcional.<\/li>\n<li>Se n\u00e3o estiver presente, exibiremos um aviso. Se estiver presente, exibiremos uma parcial.<\/li>\n<\/ol>\n<p>Direto o suficiente, certo?<\/p>\n<p>A \u00fanica coisa a notar \u00e9 que toda essa l\u00f3gica ser\u00e1 mantida dentro do plugin prim\u00e1rio (ou seja, aquele que vai verificar a presen\u00e7a do outro plugin).<\/p>\n<h3>1 L\u00f3gica Condicional do Modelo<\/h3>\n<p>A primeira coisa que precisa ser feita \u00e9 ter uma fun\u00e7\u00e3o que verifique a presen\u00e7a do plugin secund\u00e1rio. A raz\u00e3o para isso \u00e9 porque o modelo est\u00e1 fazendo algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-00-template-example-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/a><\/strong><\/p>\n<pre><code>&lt;div class=\"wrap\"&gt;\n    &lt;!-- Snipping out irrelevant code in this file --&gt;\n    &lt;form id=\"yhd-upload-new-item-settings\"&gt;\n        &lt;?php if (!$this-&gt;hasSecondaryPlugin()) { ?&gt;\n            &lt;?php include_once 'partials\/error-inactive-plugin.php'; ?&gt;\n        &lt;?php } else { ?&gt;\n            &lt;h2&gt;Secondary Plugin Settings&lt;\/h2&gt;\n            &lt;p class=\"description\"&gt;The Secondary Plugin is installed and active.&lt;\/p&gt;\n            &lt;form method=\"post\" action=\"&lt;?php echo esc_html(admin_url('admin-post.php')); ?&gt;\"&gt;\n                &lt;label for=\"acme-secondary-plugin\"&gt;\n                    &lt;input type=\"checkbox\" name=\"acme-secondary-plugin\" value=\"true\"\/&gt;\n                    Would you like to automatically use the secondary plugin?\n                &lt;\/label&gt;\n                &lt;!-- Snipping out irrelevant code in this file --&gt;\n            &lt;\/form&gt;\n        &lt;?php } ?&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>E ent\u00e3o a parcial pode se parecer <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-01-error-inactive-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">com isso<\/a><\/strong> (depende da sua implementa\u00e7\u00e3o):<\/p>\n<pre><code>&lt;?php\n\/**\n * This is the partial displayed when the Secondary Plugin is not active.\n *\/\n?&gt;\n&lt;div id=\"inactive-importer-message\" class=\"error notice is-dismissible\"&gt;\n    &lt;p&gt;[The message you want to display here.]&lt;\/p&gt;\n    &lt;button type=\"button\" class=\"notice-dismiss\"&gt;\n        &lt;span class=\"screen-reader-text\"&gt;Dismiss this notice.&lt;\/span&gt;\n    &lt;\/button&gt;\n&lt;\/div&gt;&lt;!-- #inactive-importer-message --&gt;<\/code><\/pre>\n<p>Por causa de como os modelos s\u00e3o inclu\u00eddos no WordPress, a fun\u00e7\u00e3o ficar\u00e1 dentro de uma classe e a classe verificar\u00e1 a presen\u00e7a do plug-in.<\/p>\n<p>Se voc\u00ea usar qualquer sniffer de c\u00f3digo, ele provavelmente acionar\u00e1 um aviso de que o m\u00e9todo n\u00e3o \u00e9 usado, mas o m\u00e9todo \u00e9 usado, \u00e9 usado apenas em um arquivo de modelo. Anote em uma aula. Tudo isso para dizer, alguns de nossos farejadores n\u00e3o s\u00e3o t\u00e3o inteligentes. Ainda.<\/p>\n<h3>2 O c\u00f3digo do lado do servidor do plug-in<\/h3>\n<p>Uma vez que voc\u00ea tenha uma ideia geral de como isso vai funcionar, \u00e9 hora de escrever o c\u00f3digo em sua classe.<\/p>\n<p>Lembre-se, esta \u00e9 uma fun\u00e7\u00e3o simples: ela s\u00f3 precisa verificar a presen\u00e7a de um plugin. Voc\u00ea pode fazer isso de algumas maneiras, mas a mais comum pode ser usar a fun\u00e7\u00e3o da API <strong><a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/is_plugin_active\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">is_active_plugin .<\/a><\/strong><\/p>\n<p>Observe que, ao usar esta fun\u00e7\u00e3o, ela se baseia na ideia de que voc\u00ea sabe o nome do plug-in que est\u00e1 usando. Se n\u00e3o, existem outras maneiras, mas isso est\u00e1 fora do escopo deste post.<\/p>\n<p>De qualquer forma, como a l\u00f3gica \u00e9 condicional, ela precisa retornar um valor booleano, e \u00e9 exatamente isso que a fun\u00e7\u00e3o da API acima faz. Portanto, a fun\u00e7\u00e3o do lado do servidor pode ser algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/fe4cbdc9eb5e6409fb4f9e3e1784f97d#file-02-hassecondaryplugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Determines if the Secondary Importer is is activated.\n *\n * @return bool True if the the pklugin is active; false, otherwise.\n *\/\nprivate function hasSecondaryPlugin()\n{\n    return in_array(\n        'secondary-plugin\/secondary-plugin.php',\n        get_option('active_plugins')\n    );\n}\n<\/code><\/pre>\n<p>E como o c\u00f3digo do modelo chama essa fun\u00e7\u00e3o (que voc\u00ea v\u00ea acima), ele determinar\u00e1 se precisa mostrar uma parcial ou n\u00e3o.<\/p>\n<h2>Bastante f\u00e1cil<\/h2>\n<p>Para alguns, isso \u00e9 algo realmente simples; para outros, \u00e9 uma abordagem completamente diferente, pois trata de uma maior separa\u00e7\u00e3o de interesses.<\/p>\n<p>E como continuo a trabalhar com o <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">OOP Fundamentals<\/a><\/strong> com os membros do site, acho importante tamb\u00e9m compartilhar algumas das melhores pr\u00e1ticas com aqueles que podem n\u00e3o ser membros, mas est\u00e3o ansiosos para escrever um c\u00f3digo mais organizado.<\/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>Use programa\u00e7\u00e3o orientada a objetos e l\u00f3gica condicional para separar as preocupa\u00e7\u00f5es entre parciais, modelos e c\u00f3digo do lado do servidor.<\/p>\n","protected":false},"author":1,"featured_media":164710,"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-230268","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\/230268","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=230268"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230268\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/164710"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230268"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230268"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}