{"id":229900,"date":"2022-11-13T12:31:00","date_gmt":"2022-11-13T09:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229900"},"modified":"2022-11-13T12:34:03","modified_gmt":"2022-11-13T09:34:03","slug":"como-usar-plugins-wordpress-de-carregamento-automatico-psr-4","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/como-usar-plugins-wordpress-de-carregamento-automatico-psr-4\/","title":{"rendered":"Como usar plugins WordPress de carregamento autom\u00e1tico PSR-4"},"content":{"rendered":"\n<p>Digamos que voc\u00ea est\u00e1 trabalhando em um projeto para algu\u00e9m e o definiu, as tarefas s\u00e3o delegadas, voc\u00ea tem todas as bibliotecas e ferramentas necess\u00e1rias para come\u00e7ar e separou qual ser\u00e1 o tema ou apresenta\u00e7\u00e3o, e qual ser\u00e1 a funcionalidade ou os plugins.<\/p>\n<p>Mas em vez de ter um punhado de plugins individuais, e se houvesse um pacote de plugins funcionais menores ou micro-plugins ou o que voc\u00ea quiser cham\u00e1-los trabalhando para alimentar o pacote?<\/p>\n<p>Al\u00e9m disso, todos eles s\u00e3o constru\u00eddos sobre a mesma base, mas que tamb\u00e9m compartilham c\u00f3digo entre si e para tornar as coisas mais interessantes, voc\u00ea opta por usar um autoloader PSR-4 via <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Composer<\/a> para cuidar de tudo isso?<\/p>\n<h2>Plugins WordPress de carregamento autom\u00e1tico PSR-4<\/h2>\n<p>Primeiro, a maneira de pensar no que estou tentando dizer (porque quem sabe se estou claro \ud83d\ude43) \u00e9 que voc\u00ea tem seu trabalho no <code>wp-content\/plugins<\/code>diret\u00f3rio. E seu plugin reside, digamos, <code>acme-plugins<\/code>e possui subdiret\u00f3rios para seus micro-plugins.<\/p>\n<p>Vamos manter isso simples para este exemplo e dizer que h\u00e1 o plugin principal e apenas um micro-plugin. O diret\u00f3rio seria algo assim;<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-165780-61e788fa5037d.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-165780-61e788fa5037d.png\" alt=\"Como usar plugins WordPress de carregamento autom\u00e1tico PSR-4\"><\/a><\/p>\n<p>Agora, h\u00e1 os arquivos que voc\u00ea espera ver em um plugin:<\/p>\n<ul>\n<li>LEIA-ME,<\/li>\n<li>LICEN\u00c7A,<\/li>\n<li>CHANGELOG,<\/li>\n<li>compositor.json<\/li>\n<li>compositor.lock<\/li>\n<li>fornecedor<\/li>\n<li>o arquivo de inicializa\u00e7\u00e3o do plugin,<\/li>\n<li>etc.<\/li>\n<\/ul>\n<p>Agora \u00e9 o seguinte: se voc\u00ea estiver usando <a href=\"http:\/\/www.php-fig.org\/psr\/psr-2\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o PSR-2<\/a> e estiver usando um autoloader <a href=\"http:\/\/www.php-fig.org\/psr\/psr-4\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PSR-4<\/a>, h\u00e1 duas coisas que voc\u00ea precisa saber:<\/p>\n<ol>\n<li>Os namespaces devem corresponder \u00e0 organiza\u00e7\u00e3o do diret\u00f3rio. Falei um pouco sobre isso durante <a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/namespaces-e-carregamento-automatico-no-wordpress\/\" title=\"minha apresenta\u00e7\u00e3o do WordCamp Atlanta 2017\">minha apresenta\u00e7\u00e3o do WordCamp Atlanta 2017<\/a> (especificamente sob organiza\u00e7\u00e3o virtual e l\u00f3gica).<\/li>\n<li>Como trabalhar <code>composer.json<\/code>para definir seus autoloaders. Voc\u00ea pode ler muito sobre isso <a href=\"https:\/\/getcomposer.org\/doc\/01-basic-usage.md#autoloading\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqui<\/a>, mas vou dar as notas do precip\u00edcio no restante deste post.<\/li>\n<\/ol>\n<p>Portanto, o problema \u00e9 que o <code>vendor<\/code>diret\u00f3rio reside em um n\u00edvel acima de onde existem alguns dos arquivos de origem. Assim, a maneira padr\u00e3o de configurar um autoloader personalizado no Composer n\u00e3o funcionar\u00e1.<\/p>\n<p>Por exemplo, \u00e9 muito comum <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c7703a3b7c27594918f0af7a2a7d5fe4#file-00-composer-autoloader-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ver isso<\/a> :<\/p>\n<pre><code>{\n  \"name\": \"pressware\/acme-plugins\",\n  \"description\": \"A demo plugin\",\n  \"autoload\": {\n    \"psr-4\": {\n      \"Acme\": \"src\/\",\n    }\n  },\n  \/\/ ...\n}<\/code><\/pre>\n<p>Mas para compensar nosso trabalho, precisamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/c7703a3b7c27594918f0af7a2a7d5fe4#file-01-composer-updated-autoloader-json\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fazer isso<\/a> :<\/p>\n<pre><code>{\n  \"name\": \"pressware\/acme-plugins\",\n  \"description\": \"A demo plugin\",\n  \"autoload\": {\n    \"psr-4\": {\n      \"Acme\": \"\",\n      \"AcmeMicroPlugin\": \"MicroPlugin\/src\/\"\n    }\n  },\n  \/\/ ...\n}<\/code><\/pre>\n<p>\u00c9 uma mudan\u00e7a simples, mas \u00e9 um exemplo simples, certo? Ent\u00e3o, qual \u00e9 a li\u00e7\u00e3o disso?<\/p>\n<p>Observe que atualizamos algumas altera\u00e7\u00f5es no\u00a0 local de <strong>carregamento autom\u00e1tico<\/strong>. Especificamente, isso \u00e9 o que est\u00e1 acontecendo:<\/p>\n<ul>\n<li>O primeiro item \u00e9 o namespace de n\u00edvel superior ao qual pertencer\u00e3o todos os plug-ins que pertencer\u00e3o ao <strong>plug-in Acme<\/strong>.<\/li>\n<li>A segunda entrada refere-se ao <strong>MicroPlugin<\/strong> que voc\u00ea v\u00ea no diret\u00f3rio acima. Isso representa o namespace para este plugin em particular e diz ao Composer para procurar arquivos de origem para carregar automaticamente usando o diret\u00f3rio de propriedades<\/li>\n<\/ul>\n<p>A partir daqui, voc\u00ea adicionar\u00e1 uma nova entrada para o autoloader correspondente a cada micro-plugin que pertencer\u00e1 ao plug-in de n\u00edvel superior.<\/p>\n<h2>Organizando futuros microplugins<\/h2>\n<p>Existem algumas maneiras de organizar seu c\u00f3digo para que voc\u00ea possa usar um carregador autom\u00e1tico padr\u00e3o.<\/p>\n<p>Se voc\u00ea seguir o modelo de micro-plugin (por falta de um termo melhor), ele n\u00e3o funcionar\u00e1, ent\u00e3o voc\u00ea ter\u00e1 que reorganizar seus arquivos, e isso pode ser uma dor ao longo do tempo.<\/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>PSR-4 Autoloading WordPress Plugins n\u00e3o \u00e9 dif\u00edcil, mas e se voc\u00ea quiser usar um plugin composto por uma variedade de plugins e carreg\u00e1-los automaticamente tamb\u00e9m?<\/p>\n","protected":false},"author":1,"featured_media":223885,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,816,846,867],"tags":[1170],"class_list":["post-229900","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-plug-ins","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229900","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=229900"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229900\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223885"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229900"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229900"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229900"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}