{"id":229918,"date":"2022-11-13T18:05:00","date_gmt":"2022-11-13T15:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229918"},"modified":"2022-11-09T19:17:14","modified_gmt":"2022-11-09T16:17:14","slug":"obter-enderecos-de-usuarios-no-wordpress-parte-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/obter-enderecos-de-usuarios-no-wordpress-parte-1\/","title":{"rendered":"Obter endere\u00e7os de usu\u00e1rios no WordPress, parte 1"},"content":{"rendered":"\n<p>Digamos que voc\u00ea esteja trabalhando em um projeto no qual deseja fornecer ao usu\u00e1rio a capacidade de baixar todos os endere\u00e7os de e-mail dos usu\u00e1rios que existem na instala\u00e7\u00e3o do WordPress. Concedido, isso tem alguns requisitos:<\/p>\n<ul>\n<li>Voc\u00ea s\u00f3 quer que os administradores fa\u00e7am isso,<\/li>\n<li>Ele precisa ser seguro por meio de valores nonce,<\/li>\n<li>As respostas devem estar em JSON,<\/li>\n<li>E voc\u00ea deseja usar JavaScript para enviar o arquivo quando estiver pronto para download.<\/li>\n<\/ul>\n<p>Cada um dos conceitos acima provavelmente j\u00e1 foi abordado aqui antes, mas e se voc\u00ea quiser junt\u00e1-los todos? Ou seja, e se voc\u00ea quiser facilitar o download de endere\u00e7os de e-mail de usu\u00e1rios via JSON no WordPress de, digamos, um menu de administra\u00e7\u00e3o ou um submenu?<\/p>\n<p>Uma foto obrigat\u00f3ria de onde estou trabalhando enquanto escrevo este post.<\/p>\n<p>Aqui est\u00e1 uma maneira de resolver esse problema. Observe que ele pressup\u00f5e que voc\u00ea tenha algum conhecimento dos itens acima, mas farei o que puder para cobrir cada um dos itens acima.<\/p>\n<h2>Baixar endere\u00e7os de e-mail do usu\u00e1rio via JSON<\/h2>\n<p>Antes de come\u00e7ar, observe que estou configurando isso para funcionar sempre que um usu\u00e1rio clicar em um submenu no\u00a0 menu <strong>Ferramentas<\/strong> no WordPress.<\/p>\n<p>Como voc\u00ea configura seus ganchos pode variar. Comecei a usar um tipo particular de arquitetura que est\u00e1 se tornando cada vez mais padr\u00e3o nos projetos que uso para mim e que usamos na <a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a>, mas estou divagando sobre isso (talvez eu forne\u00e7a algumas dicas para isso mais tarde).<\/p>\n<h3>Adicionando um submenu<\/h3>\n<p>De qualquer forma, aqui est\u00e1 o c\u00f3digo para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-00-add-submenu-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">adicionar o submenu<\/a>.<\/p>\n<pre><code>&lt;?php\npublic function addSubmenuPage()\n{\n    add_submenu_page(\n        'tools.php',\n        'Export Emails',\n        'Export Emails',\n        'manage_options',\n        'acme-export-emails',\n        'exportEmails'\n    );\n}\n<\/code><\/pre>\n<p>\u00c9 exatamente o que voc\u00ea esperaria, certo? Se estiver usando c\u00f3digo orientado a objetos, voc\u00ea pode (ou n\u00e3o, novamente, dependendo de como voc\u00ea arquitetou sua solu\u00e7\u00e3o) precisar usar uma matriz para especificar uma inst\u00e2ncia da classe atual e seu m\u00e9todo.<\/p>\n<p>Observe tamb\u00e9m que n\u00e3o vou me preocupar com internacionaliza\u00e7\u00e3o no contexto deste post. N\u00e3o \u00e9 que n\u00e3o possa ser feito; n\u00e3o \u00e9 que n\u00e3o seja importante. \u00c9 uma quest\u00e3o de tentar manter o post o mais enxuto poss\u00edvel.<\/p>\n<h3>Registrando o JavaScript<\/h3>\n<p>Vou supor que voc\u00ea tenha um\u00a0 arquivo <strong>exportEmail.js<\/strong> localizado em seu perfil e este \u00e9 o arquivo que ser\u00e1 respons\u00e1vel por consultar o lado do servidor e retornar o arquivo para download.<\/p>\n<p>A primeira coisa a fazer \u00e9 registrar com seguran\u00e7a o JavaScript no lado do servidor usando <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-01-register-javascript-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as fun\u00e7\u00f5es padr\u00e3o da API<\/a> :<\/p>\n<pre><code>&lt;?php\n\npublic function addJavaScript()\n{\n    if (!current_user_can('manage_options')) {\n        return;\n    }\n\n    wp_enqueue_script(\n        'acme-email-export-admin',\n        $this-&gt;plugin_url. 'Emails\/assets\/scripts\/exportEmail.js',\n        array('jquery')\n    );\n\n    wp_localize_script(\n        'acme-email-export-admin',\n        'acme_email_export',\n        array(\n            'ajax_url' =&gt; admin_url('admin-ajax.php'),\n            'security' =&gt; wp_create_nonce('acme-email-export-nonce')) );\n}\n<\/code><\/pre>\n<p>Feito isso, voc\u00ea pode escrever o JavaScript que chamar\u00e1 o server-side. Mas esta \u00e9 uma etapa de duas partes: inclui JavaScript e mais c\u00f3digo do lado do servidor.<\/p>\n<h3>O lado do cliente chamando o lado do servidor<\/h3>\n<p>Como o b\u00e1sico est\u00e1 em vigor para chamar o lado do servidor, \u00e9 poss\u00edvel configurar o JavaScript agora.<\/p>\n<p>Primeiro, h\u00e1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-02-click-handler-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o manipulador de cliques<\/a> :<\/p>\n<pre><code>$('a[href=\"tools.php?page=acme-export-emails\"]').on('click', function(evt){\n    evt.preventDefault();\n    _getEmailAddresses($(this));\n});<\/code><\/pre>\n<p><strong>A chamada get<\/strong> inicial deve ser algo <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-03-get-email-addresses-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a> :<\/p>\n<pre><code>var _getEmailAddresses = function($elem) {\n    $.get(acme_email_export.ajax_url, {\n        security:  acme_email_export.security,\n        action:    'getEmailAddresses'\n    }, function(response) {\n\n        if ('' === response) {\n            return;\n        }\n        \/\/ TODO...\n    });\n};<\/code><\/pre>\n<p>Observe que ele usa o valor de seguran\u00e7a que criamos anteriormente e, em seguida, usa o nome de outra fun\u00e7\u00e3o, ou seja\u00a0, <strong>getEmailAddresses<\/strong>, que est\u00e1 chamando no lado do servidor.<\/p>\n<p>Essa fun\u00e7\u00e3o \u00e9 respons\u00e1vel por executar uma consulta, obter os endere\u00e7os de e-mail e gravar um arquivo JSON tempor\u00e1rio para retornar ao usu\u00e1rio.<\/p>\n<h4>1 Obtenha os endere\u00e7os de e-mail dos usu\u00e1rios<\/h4>\n<p>Primeiro, <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a> possibilitar\u00e1 a retirada de todos os usu\u00e1rios para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-04-get-email-addresses-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">determinados crit\u00e9rios<\/a>.<\/p>\n<pre><code>&lt;?php\nprivate function getUserResults()\n{\n    $query   = new WP_User_Query(\n        array(\n            'role_in' =&gt; array('administrator','subscriber')) );\n    return $query-&gt;get_results();\n}\n<\/code><\/pre>\n<p>Para os prop\u00f3sitos deste exemplo, obviamente estou esclarecendo os argumentos.<\/p>\n<h4>2 Analise o e-mail dos resultados<\/h4>\n<p>Em seguida, vou percorrer os resultados e armazenar os endere\u00e7os de e-mail <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-05-parse-email-results-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">em uma matriz<\/a> (que eventualmente converterei em JSON).<\/p>\n<pre><code>&lt;?php\n\nprivate function getUserInfo($results)\n{\n    $user_info = array();\n    foreach ($results as $result) {\n        if (isset($result-&gt;user_email)) {\n            array_push($user_info, $result-&gt;user_email);\n        }\n    }\n\n    return $user_info;\n}\n<\/code><\/pre>\n<p>Observe que existem outras maneiras de fazer isso. Essa \u00e9 apenas uma maneira de fazer isso para um conjunto menor de dados, mas se voc\u00ea estiver trabalhando para algo um pouco maior, recomendo uma alternativa (que est\u00e1 al\u00e9m do escopo deste post).<\/p>\n<h2>A seguir<\/h2>\n<p>Obviamente, esta \u00e9 apenas a primeira parte de como conectar tudo isso.<\/p>\n<p>No pr\u00f3ximo post, abordarei:<\/p>\n<ul>\n<li>convertendo as informa\u00e7\u00f5es retornadas em JSON,<\/li>\n<li>gravando esse arquivo no disco,<\/li>\n<li>e como unir o resto usando JavaScript.<\/li>\n<\/ul>\n<p>A etapa final incluir\u00e1 a cria\u00e7\u00e3o de um elemento e o acionamento de seu evento de clique para que o usu\u00e1rio seja apresentado \u00e0 caixa de di\u00e1logo de download em vez do texto real em uma janela do navegador.<\/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>E se voc\u00ea quiser facilitar o download de endere\u00e7os de e-mail de usu\u00e1rios via JSON no WordPress a partir de, digamos, um menu de administra\u00e7\u00e3o ou um submenu?<\/p>\n","protected":false},"author":1,"featured_media":224083,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,806,846,867],"tags":[1170],"class_list":["post-229918","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229918","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=229918"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229918\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/224083"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229918"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229918"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229918"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}