{"id":230785,"date":"2022-12-05T13:01:00","date_gmt":"2022-12-05T10:01:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230785"},"modified":"2022-11-09T23:59:39","modified_gmt":"2022-11-09T20:59:39","slug":"o-basico-dos-ganchos-de-acao-no-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/o-basico-dos-ganchos-de-acao-no-wordpress\/","title":{"rendered":"O b\u00e1sico dos ganchos de a\u00e7\u00e3o no WordPress"},"content":{"rendered":"\n<p>Sempre que come\u00e7a a entrar em programa\u00e7\u00e3o mais avan\u00e7ada \u2013 seja no WordPress ou em qualquer outra estrutura, biblioteca, funda\u00e7\u00e3o ou linguagem de programa\u00e7\u00e3o \u2013 h\u00e1 momentos em que novos conceitos podem ser mais dif\u00edceis de entender do que outros.<\/p>\n<p>Eu geralmente descobri que isso \u00e9 verdade sempre que uma pessoa aprendeu o b\u00e1sico de, digamos, programa\u00e7\u00e3o orientada a objetos, mas n\u00e3o foi exposta \u00e0s nuances de certas coisas, como padr\u00f5es de projeto.<\/p>\n<p>Caso em quest\u00e3o: eu escrevi sobre <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Event-driven_architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o padr\u00e3o de design orientado a eventos<\/a><\/strong> (ou o <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">publish-subscribe<\/a><\/strong> ou Pub\/Sub como alguns gostam de se referir a ele) <strong><a href=\"https:\/\/tommcfarlin.com\/wordpress-hooks\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">em outros posts.<\/a><\/strong><\/p>\n<p>Sim, existem algumas diferen\u00e7as para cada um, mas a ideia geral \u00e9 que algo acontece e um evento \u00e9 gerado e qualquer coisa que esteja ouvindo esse evento, ou inscrito nesse evento, responder\u00e1.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7466947738.jpg\" 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-162881-61e7466947738.jpg\" alt=\"O b\u00e1sico dos ganchos de a\u00e7\u00e3o no WordPress\" ><\/a><\/p>\n<p>Foto de Claus Gr\u00fcnst\u00e4udl no Unsplash<\/p>\n<p>Este \u00e9 o padr\u00e3o principal que o WordPress emprega e que nos permite literalmente conectar-se a certos pontos de execu\u00e7\u00e3o. Geralmente podemos conceituar isso como ganchos de a\u00e7\u00e3o no WordPress.<\/p>\n<p>De qualquer forma, o aplicativo disponibiliza alguns pontos para adicionarmos nossa pr\u00f3pria funcionalidade. Assim que essa funcionalidade for registrada, o WordPress deixar\u00e1 sua base de c\u00f3digo, por assim dizer, entrar\u00e1 na nossa e retornar\u00e1 \u00e0 nossa.<\/p>\n<p>\u00c9 bastante f\u00e1cil de entender, mas e se voc\u00ea quiser expor \u00e1reas em seu c\u00f3digo que permitem que outras pessoas se conectem ao seu c\u00f3digo?<\/p>\n<h2>Ganchos de a\u00e7\u00e3o no WordPress<\/h2>\n<p>Antes de ver como o WordPress implementa esses padr\u00f5es, \u00e9 importante entender o b\u00e1sico desse padr\u00e3o. Embora isso n\u00e3o seja abrangente, destina-se a ajudar a fornecer uma compreens\u00e3o b\u00e1sica do padr\u00e3o para que seja poss\u00edvel ler e escrever c\u00f3digo centrado no WordPress.<\/p>\n<p>Ent\u00e3o, qual \u00e9 uma boa maneira de pensar no padr\u00e3o Pub\/Sub? <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">A Wikipedia define como:<\/a><\/strong><\/p>\n<blockquote>\n<p>Na arquitetura de software, publicar-assinar \u00e9 um padr\u00e3o de mensagens em que os remetentes de mensagens, chamados editores, n\u00e3o programam as mensagens para serem enviadas diretamente para receptores espec\u00edficos, chamados assinantes, mas categorizam as mensagens publicadas em classes sem conhecimento de quais assinantes, se houver., pode ser. Da mesma forma, os assinantes manifestam interesse em uma ou mais classes e recebem apenas mensagens de seu interesse, sem conhecimento de quais editores, se houver, existem.<\/p>\n<\/blockquote>\n<h3>Entendendo o Padr\u00e3o<\/h3>\n<p>Isso pode ser muito para absorver no in\u00edcio. N\u00e3o sei, mas vamos por partes:<\/p>\n<ol>\n<li>Existe um servi\u00e7o, no nosso caso o WordPress, que \u00e9 respons\u00e1vel por publicar mensagens para quem est\u00e1 assinando (n\u00e3o necessariamente sabe quem est\u00e1 ouvindo).<\/li>\n<li>Quando um assinante estiver ouvindo, ele agir\u00e1 sempre que ouvir essa a\u00e7\u00e3o.<\/li>\n<li>Assim que o c\u00f3digo do assinante terminar de ser executado, o programa retornar\u00e1 ao ponto original de execu\u00e7\u00e3o (que \u00e9 para onde o editor enviou a mensagem).<\/li>\n<\/ol>\n<p>Existem nuances para isso, como funcionalidade ass\u00edncrona e coisas assim, mas isso \u00e9 mais avan\u00e7ado do que eu gostaria de obter neste post em particular. Afinal, o objetivo disso \u00e9 estabelecer uma base para entender e implementar a funcionalidade.<\/p>\n<p>A funcionalidade ass\u00edncrona pode entrar em threading ou Ajax e atrav\u00e9s desses s\u00e3o t\u00f3picos importantes, este n\u00e3o \u00e9 esse post.<\/p>\n<h3>Como \u00e9 isso no WordPress?<\/h3>\n<p>Talvez a maneira mais f\u00e1cil de descrever esse padr\u00e3o espec\u00edfico no WordPress seja atrav\u00e9s do uso das chamadas de fun\u00e7\u00e3o:<\/p>\n<ul>\n<li>do_action<\/li>\n<li>add_action<\/li>\n<\/ul>\n<p>\u00c0s vezes, a nomenclatura pode ser confusa, mas simplesmente, <strong>do_action<\/strong> publica e um evento e <strong>add_action<\/strong> assinantes para um evento. Ou talvez uma maneira melhor de pensar nisso seja<strong>:<\/strong><\/p>\n<p>do_action diz ao WordPress para executar quaisquer a\u00e7\u00f5es que tenham sido adicionadas.<\/p>\n<p>\u00c0s vezes, \u00e9 \u00fatil ter frases simples para lembrar como as coisas funcionam. N\u00e3o sei se a frase acima \u00e9 a mais cativante ou a mais memor\u00e1vel, mas \u00e9 alguma coisa, certo?<\/p>\n<p>Al\u00e9m disso, observe que <strong>do_action<\/strong> e <strong>add_action<\/strong> s\u00e3o coisas essenciais para o WordPress e tamb\u00e9m est\u00e3o dispon\u00edveis para nosso desenvolvimento. Antes de prosseguirmos, vamos dar uma olhada no que cada um significa:<\/p>\n<p>Para <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/do_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">do_action<\/a> :<\/p>\n<blockquote>\n<p>Esta fun\u00e7\u00e3o invoca todas as fun\u00e7\u00f5es anexadas ao gancho de a\u00e7\u00e3o <code>$tag<\/code>. \u00c9 poss\u00edvel criar novos ganchos de a\u00e7\u00e3o simplesmente chamando esta fun\u00e7\u00e3o, especificando o nome do novo gancho usando o <code>$tag<\/code>par\u00e2metro.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7466d56bdd.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-162881-61e7466d56bdd.png\" alt=\"O b\u00e1sico dos ganchos de a\u00e7\u00e3o no WordPress\" ><\/a><\/p>\n<p>Ou ainda mais simplesmente colocar:<\/p>\n<blockquote>\n<p>Executar fun\u00e7\u00f5es ligadas a um gancho de a\u00e7\u00e3o espec\u00edfico.<\/p>\n<\/blockquote>\n<p>Ao se referir a ganchos, isso pode ser <strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Hooks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ganchos definidos pelo WordPress<\/a><\/strong> ou ganchos personalizados que voc\u00ea especifica em seu tema ou plugin.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7467368f0b.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-162881-61e7467368f0b.png\" alt=\"O b\u00e1sico dos ganchos de a\u00e7\u00e3o no WordPress\" ><\/a><\/p>\n<p>Quanto a <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_action\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">add_action<\/a> :<\/p>\n<blockquote>\n<p>A\u00e7\u00f5es s\u00e3o os ganchos que o n\u00facleo do WordPress lan\u00e7a em pontos espec\u00edficos durante a execu\u00e7\u00e3o ou quando ocorrem eventos espec\u00edficos. Os plug-ins podem especificar que uma ou mais de suas fun\u00e7\u00f5es PHP sejam executadas nesses pontos, usando a API Action.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162881-61e7467888f17.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-162881-61e7467888f17.png\" alt=\"O b\u00e1sico dos ganchos de a\u00e7\u00e3o no WordPress\" ><\/a><\/p>\n<p>E, da mesma forma, de forma mais simples:<\/p>\n<blockquote>\n<p>Liga uma fun\u00e7\u00e3o a uma a\u00e7\u00e3o espec\u00edfica.<\/p>\n<\/blockquote>\n<p>Definir isso praticamente \u00e9 um pouco diferente porque geralmente usamos <strong>add_action<\/strong> para adicionar nosso pr\u00f3prio c\u00f3digo ao WordPress.<\/p>\n<h3>Um exemplo pr\u00e1tico<\/h3>\n<p>Por exemplo, talvez voc\u00ea tenha escrito algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/035b213bd632d2ab9fc4a79acffa1342\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\nadd_action('wp_insert_post_data', __NAMESPACE__. 'processPermalink');\n\/**\n * Processes the permalink so we can remove any characters that may cause a problem when communicating\n * with the API.\n *\n * @param  array $data The array of information about the post.\n * @return array $data The data without the malformed information in the post name for the URL.\n *\/\npublic function processPermalink($data)\n{\n    if (!in_array($data['post_status'], array('draft', 'pending', 'auto-draft'))) {\n        $data['post_name'] =\n            preg_replace(\n                '\/(%ef%b8%8f|\u2122|\u00ae|\u00a9|\u2122|\u00ae|\u00a9|\u2122|\u00ae|\u00a9)\/',\n                '',\n                $data['post_name']\n            );\n    }\n    return $data;\n}\n<\/code><\/pre>\n<p>Nesse caso, em algum lugar na base de c\u00f3digo do WordPress h\u00e1 uma chamada <strong>do_action<\/strong> para o gancho <strong>wp_insert_post_data<\/strong> e ele aceita uma fun\u00e7\u00e3o e passar\u00e1 pelo menos um \u00fanico par\u00e2metro.<\/p>\n<h3>Adicionando seus pr\u00f3prios ganchos<\/h3>\n<p>Mas e se voc\u00ea quiser dar a outros desenvolvedores a capacidade de se conectar ao seu plugin ou tema? Nesse caso, voc\u00ea deve se preocupar em usar do_action e a p\u00e1gina vinculada anteriormente neste documento fornece tudo o que voc\u00ea precisa para configurar isso.<\/p>\n<p>Na verdade, \u00e9 muito mais simples, na minha opini\u00e3o, do que trabalhar com <strong>add_action<\/strong> porque <strong>add_action<\/strong> fornece que n\u00e3o apenas nos conectamos a um editor existente, mas tamb\u00e9m adicionamos nossa pr\u00f3pria l\u00f3gica personalizada.<\/p>\n<p><strong>do_action<\/strong> por outro lado requer que forne\u00e7amos um nome da fun\u00e7\u00e3o a ser executada e ent\u00e3o a lista de argumentos a serem passados \u200b\u200bpara a fun\u00e7\u00e3o que ser\u00e1 executada.<\/p>\n<h2>\u00c9 isso?<\/h2>\n<p>Em termos t\u00e3o simples quanto posso fazer, sim. Existem algumas nuances sobre prioridade, n\u00famero de argumentos e trabalho com namespaces e programa\u00e7\u00e3o orientada a objetos. Mas, novamente, isso est\u00e1 fora do escopo deste post em particular. Talvez eu vou aprofund\u00e1-lo em outro post.<\/p>\n<p>Por enquanto, por\u00e9m, se voc\u00ea n\u00e3o estiver familiarizado com o b\u00e1sico de:<\/p>\n<ul>\n<li>o padr\u00e3o Pub\/Sub,<\/li>\n<li>do_action,<\/li>\n<li>e add_action<\/li>\n<\/ul>\n<p>Agora voc\u00ea est\u00e1 confort\u00e1vel o suficiente para ler o c\u00f3digo com o qual est\u00e1 trabalhando, entender como o c\u00f3digo est\u00e1 funcionando e at\u00e9 mesmo implementar suas pr\u00f3prias solu\u00e7\u00f5es quando necess\u00e1rio.<\/p>\n<p>Atualmente estou escrevendo um eBook (junto com uma variedade de outros conte\u00fados premium). Se voc\u00ea estiver interessado, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">confira o que voc\u00ea recebe<\/a>.<\/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>Compreender o b\u00e1sico dos ganchos de a\u00e7\u00f5es no WordPress \u00e9 importante, mas antes de fazer isso, \u00e9 importante reconhecer o padr\u00e3o de design subjacente.<\/p>\n","protected":false},"author":1,"featured_media":162882,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[867],"tags":[1170],"class_list":["post-230785","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230785","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=230785"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230785\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/162882"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}