{"id":229348,"date":"2022-10-30T13:48:00","date_gmt":"2022-10-30T10:48:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229348"},"modified":"2022-11-09T06:36:28","modified_gmt":"2022-11-09T03:36:28","slug":"interfaces-de-plugins-do-wordpress-trabalhando-com-ativos","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/interfaces-de-plugins-do-wordpress-trabalhando-com-ativos\/","title":{"rendered":"Interfaces de plugins do WordPress: trabalhando com ativos"},"content":{"rendered":"\n<p>Uma das vantagens de trabalhar com programa\u00e7\u00e3o orientada a objetos \u00e9 a capacidade de definir interfaces para que as classes que implementam essas interfaces tenham um conjunto estrito de fun\u00e7\u00f5es que essas classes devem implementar.<\/p>\n<p>Essa \u00e9 <a href=\"https:\/\/stackoverflow.com\/a\/1022066\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">a defini\u00e7\u00e3o<\/a> de uma interface de classe, de qualquer maneira:<\/p>\n<blockquote>\n<p>Uma interface \u00e9 um contrato que especifica um conjunto de m\u00e9todos, campos e propriedades que estar\u00e3o dispon\u00edveis em qualquer objeto de implementa\u00e7\u00e3o<\/p>\n<\/blockquote>\n<p>Mas como isso pode parecer se estivermos com o objetivo de criar uma solu\u00e7\u00e3o com namespace para incluir interfaces de plug-in do WordPress (ou uma interface) para uma classe que pode ser usada para enfileirar folhas de estilo ou arquivos JavaScript?<\/p>\n<h2>Interfaces de plug-in do WordPress: ativos<\/h2>\n<p>Para os prop\u00f3sitos deste post, suponha que estamos definindo uma interface que ser\u00e1 usada na \u00e1rea de administra\u00e7\u00e3o do WordPress. Ou seja, estaremos criando uma interface que ser\u00e1 usada para enfileirar folhas de estilo e arquivos JavaScript.<\/p>\n<p>Precisaremos incorporar o seguinte:<\/p>\n<ul>\n<li>um namespace que pode ser usado em todo o projeto,<\/li>\n<li>uma fun\u00e7\u00e3o para inicializar a classe,<\/li>\n<li>uma fun\u00e7\u00e3o para realmente enfileirar os ativos.<\/li>\n<\/ul>\n<p>E como isso \u00e9 gen\u00e9rico o suficiente para ser usado para JavaScript e folhas de estilo, optei por simplesmente cham\u00e1-lo <strong>de Asset<\/strong>.<\/p>\n<p>O resultado final pode ser algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-00-interface-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdminInterfaces;\n\ninterface Asset {\n\n    public function init();\n    public function enqueue();\n}\n<\/code><\/pre>\n<p>Em seguida, precisamos realmente <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-01-javascript-asset-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implementar a interface<\/a> com uma classe. Deve ser relativamente simples, pois definimos os m\u00e9todos que devem ser implementados.<\/p>\n<p>Observe, no entanto, que forne\u00e7o algumas propriedades que s\u00e3o definidas no construtor da classe. Eles s\u00e3o espec\u00edficos para essa classe e facilitam um pouco o ato de enfileirar um arquivo.<\/p>\n<pre><code>&lt;?php\n\nnamespace AcmeAdmin;\nuse AcmeAdminInterfaces;\n\nclass JavaScript_Assets implements InterfacesAsset {\n\n    private $assets_dir;\n\n    private $js_dir;\n\n    public function __construct() {\n\n        $this-&gt;assets_dir = trailingslashit(\n            plugin_dir_url( __FILE__ ). 'assets'\n        );\n\n        $this-&gt;js_dir = trailingslashit( $this-&gt;assets_dir. 'js' );\n    }\n\n    public function init() {\n\n        add_action(\n            'admin_enqueue_scripts',\n            array( $this, 'enqueue') );\n    }\n\n    public function enqueue() {\n\n        wp_enqueue_script(\n            'toggle-admin-notices',\n            $this-&gt;js_dir. 'admin.js',\n            array( 'jquery' ),\n            false\n        );\n    }\n}\n<\/code><\/pre>\n<p>Algumas coisas a serem observadas sobre o c\u00f3digo acima:<\/p>\n<ul>\n<li>ele usa a\u00a0 palavra-chave <strong>use<\/strong> para que o PHP saiba que trabalharemos com a interface <strong>Asset ,<\/strong><\/li>\n<li>Eu prefixei o nome com <strong>JavaScript<\/strong> para que fique claro com que tipo de ativo estou trabalhando.<\/li>\n<\/ul>\n<p>Finalmente, para instanciar a classe que implementa a interface, voc\u00ea simplesmente <a href=\"https:\/\/gist.github.com\/tommcfarlin\/30521dcf0c493283327bf9162c7b9a35#file-02-class-instantiation-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">faz isso<\/a> :<\/p>\n<pre><code>&lt;?php\n\n$assets = new AdminJavaScript_Assets();\n$assets-&gt;init();\n<\/code><\/pre>\n<p>Claro, este exemplo em particular \u00e9 simples e deixei os coment\u00e1rios de c\u00f3digo usuais de fora, mas isso geralmente \u00e9 para facilitar a leitura. Se voc\u00ea quiser ver algo assim em a\u00e7\u00e3o, revise o c\u00f3digo-fonte para<\/p>\n<p>Se voc\u00ea quiser ver algo assim em a\u00e7\u00e3o, revise o c\u00f3digo-fonte <a href=\"https:\/\/github.com\/tommcfarlin\/toggle-admin-notices\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desse plug-in espec\u00edfico<\/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>Como seria se pretendemos criar uma solu\u00e7\u00e3o para interfaces de plug-in do WordPress para uma classe que possa ser usada para enfileirar ativos?<\/p>\n","protected":false},"author":1,"featured_media":220968,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,920,846,867],"tags":[1170],"class_list":["post-229348","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-outro","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229348","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=229348"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229348\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/220968"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}