{"id":229022,"date":"2022-10-22T09:44:00","date_gmt":"2022-10-22T06:44:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229022"},"modified":"2022-11-09T05:13:27","modified_gmt":"2022-11-09T02:13:27","slug":"parar-a-execucao-do-plug-in-sem-dependencia","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/parar-a-execucao-do-plug-in-sem-dependencia\/","title":{"rendered":"Parar a execu\u00e7\u00e3o do plug-in sem depend\u00eancia"},"content":{"rendered":"\n<p>Se voc\u00ea abordar muito o desenvolvimento de plugins do WordPress a partir de uma perspectiva orientada a objetos, eventualmente chegar\u00e1 a um ponto em que n\u00e3o estar\u00e1 interagindo diretamente com o pr\u00f3prio n\u00facleo do WordPress.<\/p>\n<p>E, na minha opini\u00e3o, isso \u00e9 uma coisa boa. \u00c9 um sinal de uma arquitetura que voc\u00ea est\u00e1 estruturando seu c\u00f3digo corretamente. Aquilo \u00e9:<\/p>\n<ol>\n<li>Voc\u00ea tem o WordPress sentado no n\u00edvel fundamental,<\/li>\n<li>Voc\u00ea tem um conjunto de classes que est\u00e3o logo acima do WordPress respons\u00e1vel por enviar informa\u00e7\u00f5es de e para o WordPress entre o plugin,<\/li>\n<li>E voc\u00ea tem o resto do seu c\u00f3digo que compreende o resto da funcionalidade.<\/li>\n<\/ol>\n<p>A forma como isso \u00e9 implementado pode variar, mas a maneira geral de imaginar isso \u00e9 a mesma que costumo pensar no aplicativo padr\u00e3o <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multitier_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">de N camadas<\/a>, onde voc\u00ea tem a camada de dados, a camada de aplicativo e o front-end.<\/p>\n<p>Exceto por este tempo, voc\u00ea tem o WordPress, uma camada para comunica\u00e7\u00e3o com o WordPress e o resto do seu c\u00f3digo e, voc\u00ea sabe, o resto do seu c\u00f3digo.<\/p>\n<p>Como um plugin pode ser organizado.<\/p>\n<p>Ent\u00e3o, o que acontece quando voc\u00ea deseja interromper a execu\u00e7\u00e3o do plug-in quando ele precisa interagir com uma depend\u00eancia de terceiros e s\u00f3 deve ser executado se essa depend\u00eancia estiver presente?<\/p>\n<h2>Parar a execu\u00e7\u00e3o do plug-in<\/h2>\n<p>Devido \u00e0 natureza do PHP e do WordPress, existem algumas maneiras de fazer isso. O c\u00f3digo que vou compartilhar n\u00e3o prescreve a maneira de fazer isso.<\/p>\n<p>Em vez disso, essa \u00e9 uma maneira de fazer isso (que foi extra\u00edda de algo que est\u00e1 em desenvolvimento). Al\u00e9m disso, mostrarei como ele interage com alguns outros componentes dos plugins tamb\u00e9m.<\/p>\n<h3>1 O Construtor<\/h3>\n<p>Se voc\u00ea ler artigos suficientes sobre WordPress e programa\u00e7\u00e3o orientada a objetos, provavelmente descobrir\u00e1 que os construtores n\u00e3o devem ser usados \u200b\u200bpara definir ganchos. E eu concordo.<\/p>\n<p>Isso cria um n\u00edvel desnecess\u00e1rio de acoplamento e torna os testes mais dif\u00edceis. Qual, ent\u00e3o, \u00e9 o prop\u00f3sito de um construtor no c\u00f3digo baseado em WordPress?<\/p>\n<p>Eu o uso pelos mesmos motivos que voc\u00ea esperaria em qualquer outra linguagem: Para inicializar as propriedades da classe. No c\u00f3digo abaixo, voc\u00ea ver\u00e1 tr\u00eas coisas:<\/p>\n<ol>\n<li>Eu inicializo uma propriedade,<\/li>\n<li>Eu verifico se existe uma depend\u00eancia de terceiros,<\/li>\n<li>Se isso n\u00e3o acontecer, ent\u00e3o eu adiciono uma mensagem de erro,<\/li>\n<li>Eu atualizo a propriedade.<\/li>\n<\/ol>\n<p>Claro, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-00-constructor-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e9 verbose<\/a>, mas tamb\u00e9m n\u00e3o recorre a c\u00f3digo inteligente para inicializar valores.<\/p>\n<pre><code>&lt;?php\n\npublic function __construct( $container) {\n\n    $this-&gt;can_run = true;\n\n    \/\/ If the dependency isn't installed, then add a message and flag execution to stop.\n    $this-&gt;messenger = $container-&gt;get( 'settings-messenger');\n    if (! class_exists( 'Acme_Dependency')) {\n\n        $this-&gt;messenger-&gt;add_error_message( 'The dependency is not installed.' );\n        $this-&gt;can_run = false;\n    }\n}\n<\/code><\/pre>\n<p>(Quanto mais velho fico, mais gosto de c\u00f3digo espec\u00edfico, pois torna mais f\u00e1cil ler, pegar e seguir em frente a uma taxa mais r\u00e1pida do que a alternativa.)<\/p>\n<h3>2 O M\u00e9todo de Inicializa\u00e7\u00e3o<\/h3>\n<p>Como n\u00e3o estamos usando um construtor para trabalhar com ganchos do WordPress, essa funcionalidade deve existir no contexto de outro m\u00e9todo.<\/p>\n<p>Isso nos d\u00e1 um local dedicado para colocar esse tipo de funcionalidade, desacopl\u00e1-la do resto da classe e fazer com que ela interaja com o WordPress somente quando o m\u00e9todo for invocado explicitamente.<\/p>\n<p>Mas lembre-se, o ponto principal do que estou chegando tem a ver com interromper a execu\u00e7\u00e3o de um plug-in \u2013 n\u00e3o onde colocar os ganchos.<\/p>\n<p>Ent\u00e3o vamos dizer que a depend\u00eancia de terceiros n\u00e3o existe, e da\u00ed? Lembre-se que no construtor foi definida uma propriedade que nos permitir\u00e1 determinar <a href=\"https:\/\/gist.github.com\/tommcfarlin\/448d580a82b5ac615be127a0786cd3c5?ts=2#file-01-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se devemos avan\u00e7ar<\/a> com a configura\u00e7\u00e3o de ganchos ou n\u00e3o:<\/p>\n<pre><code>&lt;?php\n\npublic function init() {\n\n    if (! $this-&gt;can_run) {\n        return;\n    }\n\n    add_action( 'admin_notices', array( $this, 'admin_notices') );\n}\n<\/code><\/pre>\n<p>E quando isso estiver em vigor, o resto do c\u00f3digo n\u00e3o ser\u00e1 executado.<\/p>\n<h2>Muitas palavras, um pouco de c\u00f3digo<\/h2>\n<p>Parece muita explica\u00e7\u00e3o para t\u00e3o pouco c\u00f3digo.<\/p>\n<p>Mas uma parte disso tamb\u00e9m \u00e9 para tentar transmitir o significado de ter partes de um projeto baseado em WordPress separadas do resto do n\u00facleo para que as partes possam interagir entre si sem precisar falar explicitamente com o n\u00facleo o tempo todo.<\/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>O que acontece quando voc\u00ea deseja interromper a execu\u00e7\u00e3o do plugin quando ele precisa trabalhar com uma depend\u00eancia de terceiros e s\u00f3 deve faz\u00ea-lo se estiver presente?<\/p>\n","protected":false},"author":1,"featured_media":221144,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,920,806,867],"tags":[1170],"class_list":["post-229022","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-outro","category-php-8","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229022","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=229022"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229022\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/221144"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}