{"id":230217,"date":"2022-11-22T20:20:00","date_gmt":"2022-11-22T17:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230217"},"modified":"2022-11-09T20:38:33","modified_gmt":"2022-11-09T17:38:33","slug":"carregando-arquivos-no-wordpress-revisitado-parte-1-o-lado-do-cliente","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/carregando-arquivos-no-wordpress-revisitado-parte-1-o-lado-do-cliente\/","title":{"rendered":"Carregando arquivos no WordPress, revisitado: Parte 1 &#8211; O lado do cliente"},"content":{"rendered":"\n<p>Anos atr\u00e1s, escrevi sobre como fazer <a href=\"https:\/\/tommcfarlin.com\/upload-files-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">upload de arquivos no WordPress<\/a> a partir da \u00e1rea administrativa. Este post \u00e9 praticamente uma atualiza\u00e7\u00e3o daquele post, mas abrange novas considera\u00e7\u00f5es que fa\u00e7o e alguns outros processos que julgo necess\u00e1rios.<\/p>\n<p>Para este post, vou trabalhar com o exemplo de upload de um arquivo PDF e como tamb\u00e9m disponibiliz\u00e1-lo na Biblioteca de M\u00eddia.<\/p>\n<p>Ao fazer isso, tamb\u00e9m estou planejando cobrir algumas considera\u00e7\u00f5es que devem ser feitas no lado do cliente e no lado do servidor, bem como coisas que devem ser observadas sempre que algu\u00e9m estiver transferindo informa\u00e7\u00f5es pela rede.<\/p>\n<h2>Upload de arquivos no WordPress (e para a biblioteca de m\u00eddia)<\/h2>\n<p>Antes de chegar \u00e0 ess\u00eancia deste post, suponho que voc\u00ea tenha:<\/p>\n<ol>\n<li>Uma p\u00e1gina de submenu ou configura\u00e7\u00e3o de p\u00e1gina de administra\u00e7\u00e3o com uma entrada de arquivo,<\/li>\n<li>Que voc\u00ea est\u00e1 configurado corretamente para aceitar tipos MIME,<\/li>\n<li>Que voc\u00ea est\u00e1 confort\u00e1vel com um pouco de JavaScript,<\/li>\n<li>E voc\u00ea se sente confort\u00e1vel trabalhando com mensagens personalizadas fora da API padr\u00e3o do WordPress.<\/li>\n<\/ol>\n<p>Nesse caso, todo o c\u00f3digo deve ser relativamente autoexplicativo (n\u00e3o que eu n\u00e3o v\u00e1 detalhar parte por parte), mas se algum dos itens acima parecer confuso, o post pode incluir algum material que exija um pouco de mais pesquisas no Codex ou sobre JavaScript que fornecerei aqui.<\/p>\n<p>Independentemente disso, farei o que puder para ser o mais abrangente poss\u00edvel.<\/p>\n<h3>1 A Ideia Principal<\/h3>\n<p>A ideia do recurso \u00e9 simples: voc\u00ea deseja dar ao usu\u00e1rio a capacidade de fazer upload de arquivos PDF atrav\u00e9s da \u00e1rea de administra\u00e7\u00e3o do WordPress. Voc\u00ea tamb\u00e9m deseja que o arquivo esteja dispon\u00edvel na Biblioteca de m\u00eddia.<\/p>\n<p>A capacidade de fazer isso n\u00e3o \u00e9 dif\u00edcil, mas existem maneiras de aprimorar a experi\u00eancia do usu\u00e1rio que eu gostaria de abordar neste post tamb\u00e9m (como n\u00e3o poder fazer upload de nada at\u00e9 que o arquivo seja especificado na caixa de entrada, por exemplo exemplo).<\/p>\n<h3>2 A interface do usu\u00e1rio para verificar o tipo de arquivo<\/h3>\n<p>Primeiro, como eu disse no in\u00edcio do post, estou assumindo que voc\u00ea tem as bases estabelecidas para a p\u00e1gina de administra\u00e7\u00e3o no WordPress. Isso pode ser feito de algumas maneiras \u2013 optei por usar <a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/add_submenu_page\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma p\u00e1gina de submenu<\/a>, mas h\u00e1 algumas maneiras de fazer isso.<\/p>\n<p>Em segundo lugar, a p\u00e1gina \u00e9 simples: inclui o t\u00edtulo da p\u00e1gina, um campo de entrada de arquivo e um bot\u00e3o &#8216;Upload&#8217; que est\u00e1 desabilitado por padr\u00e3o:<\/p>\n<p>Observe que quando tento adicionar uma imagem que n\u00e3o \u00e9 um PDF, recebo uma mensagem de erro e o bot\u00e3o &#8216;Upload&#8217; ainda est\u00e1 desativado:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164805-61e76e82b59a7.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-164805-61e76e82b59a7.png\" alt=\"Carregando arquivos no WordPress, revisitado: Parte 1 - O lado do cliente\" ><\/a><\/p>\n<p>Mas quando adiciono um arquivo do tipo esperado, o bot\u00e3o &#8216;Upload&#8217; \u00e9 ativado:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164805-61e76e857097f.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-164805-61e76e857097f.png\" alt=\"Carregando arquivos no WordPress, revisitado: Parte 1 - O lado do cliente\" ><\/a><\/p>\n<p>Isso requer algumas coisas:<\/p>\n<ul>\n<li>JavaScript que detecta o tipo de arquivo,<\/li>\n<li>Parciais com visibilidade que podem ser alternados dinamicamente via JavaScript,<\/li>\n<li>E a capacidade de ativar ou desativar um bot\u00e3o de entrada de arquivo.<\/li>\n<\/ul>\n<p><strong>Uma observa\u00e7\u00e3o importante \u00e9<\/strong> que <strong>no lado do cliente:<\/strong> podemos apenas assumir que o arquivo \u00e9 o tipo de arquivo adequado com base em sua extens\u00e3o. Teremos que trabalhar mais no lado do servidor para garantir que isso seja preciso.<\/p>\n<p>Mas o ponto de verificar no lado do cliente para garantir que oferecemos a melhor experi\u00eancia poss\u00edvel por meio de mensagens de notifica\u00e7\u00e3o e op\u00e7\u00f5es de ativa\u00e7\u00e3o ou desativa\u00e7\u00e3o com base no tipo de arquivo.<\/p>\n<h3>3 Verificando o tipo de arquivo no lado do cliente<\/h3>\n<p>Suponha que neste exemplo temos uma parcial que \u00e9 renderizada sempre que tentamos fazer upload de um arquivo que n\u00e3o \u00e9 um PDF. Por padr\u00e3o, o cont\u00eainer tem um <strong>style=&quot;display:none;&quot;<\/strong> atributo que vamos manipular via JavaScript em breve:<\/p>\n<pre><code>&lt;?php\n\/**\n * Displays whenever a person tries to upload a file that isn't a PDF. This is toggled via JavaScript.\n *\/\n?&gt;\n\n&lt;div id=\"invalid-file-message\" class=\"error notice is-dismissible\" style=\"display:none;\"&gt;\n    &lt;p&gt;You have attempted to upload an invalid file type.&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;!-- #invalid-file-message --&gt;\n<\/code><\/pre>\n<p>Observe que este parcial tem um ID de <strong>invalid-file-message<\/strong>. Isso \u00e9 um pouco generalizado, pois voc\u00ea pode querer prefix\u00e1-lo com outra coisa, mas para os prop\u00f3sitos deste post, voc\u00ea entendeu.<\/p>\n<p>Para alternar a visibilidade dessa mensagem, voc\u00ea precisa configurar um manipulador em JavaScript para monitorar a altera\u00e7\u00e3o no elemento de entrada do arquivo.<\/p>\n<h3>4 Monitorando o elemento de entrada de arquivo<\/h3>\n<p>Neste ponto, \u00e9 necess\u00e1rio haver um arquivo JavaScript que monitore o valor do evento de <strong>altera\u00e7\u00e3o<\/strong> do elemento de entrada do arquivo para que ele possa determinar qual curso de a\u00e7\u00e3o tomar.<\/p>\n<p>D\u00ea uma olhada <a href=\"https:\/\/gist.github.com\/tommcfarlin\/79c7f788488e6dc84079fcf3795fa417#file-01-montorfileupload-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">neste c\u00f3digo:<\/a><\/p>\n<p>Este c\u00f3digo procurar\u00e1 o valor do campo de entrada. Se o tipo de arquivo n\u00e3o corresponder a <strong>pdf<\/strong>, ele alternar\u00e1 a visibilidade da mensagem de erro acima; caso contr\u00e1rio, ele exibir\u00e1 o bot\u00e3o de upload.<\/p>\n<p>E lembre-se, \u00e9 uma boa pr\u00e1tica enfileirar este script apenas na \u00e1rea de administra\u00e7\u00e3o e na <a href=\"https:\/\/gist.github.com\/tommcfarlin\/79c7f788488e6dc84079fcf3795fa417#file-02-enqueue-file-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00e1gina \u00e9 necess\u00e1rio<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function enqueue()\n{\n    if (!is_admin() 'acme-upload-pdf' !== get_current_screen()-&gt;id) {\n        return;\n    }\n\n    wp_enqueue_script(\n        'acme-upload-pdf-admin',\n        $this-&gt;pluginUrl. 'assets\/scripts\/admin.js',\n        ['jquery'],\n    );\n}\n<\/code><\/pre>\n<p>Tudo isso garantir\u00e1 que seu plug-in registre corretamente o script na p\u00e1gina em que ele \u00e9 necess\u00e1rio, em nenhum outro lugar, e que ele verifique adequadamente se o arquivo especificado \u00e9 do tipo correto.<\/p>\n<h2>Mas h\u00e1 mais<\/h2>\n<p>Originalmente, isso seria tudo um post, mas a quantidade de conte\u00fado para exigir tudo levaria muito tempo para filtrar (pelo menos, na minha opini\u00e3o). Ent\u00e3o, estou tentando torn\u00e1-lo um pouco mais f\u00e1cil de seguir, dividindo-o em alguns posts.<\/p>\n<p>Como mencionado anteriormente, h\u00e1 muito o que podemos fazer no lado do cliente. Claro, h\u00e1 passos que o weUplo pode tomar para ajudar a melhorar a experi\u00eancia do usu\u00e1rio, mas n\u00e3o \u00e9 o mais seguro, e h\u00e1 mais trabalho a ser feito no lado do servidor.<\/p>\n<p>Na segunda metade desta s\u00e9rie, examinarei o PHP necess\u00e1rio para gerenciar o upload de arquivos e faz\u00ea-lo com seguran\u00e7a.<\/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>Ao analisar o upload de arquivos no WordPress, \u00e9 importante pensar na experi\u00eancia do usu\u00e1rio e nos aspectos de seguran\u00e7a tamb\u00e9m.<\/p>\n","protected":false},"author":1,"featured_media":164806,"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-230217","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\/230217","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=230217"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230217\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/164806"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}