Obter endereços de usuários no WordPress, parte 1
Digamos que você esteja trabalhando em um projeto no qual deseja fornecer ao usuário a capacidade de baixar todos os endereços de e-mail dos usuários que existem na instalação do WordPress. Concedido, isso tem alguns requisitos:
- Você só quer que os administradores façam isso,
- Ele precisa ser seguro por meio de valores nonce,
- As respostas devem estar em JSON,
- E você deseja usar JavaScript para enviar o arquivo quando estiver pronto para download.
Cada um dos conceitos acima provavelmente já foi abordado aqui antes, mas e se você quiser juntá-los todos? Ou seja, e se você quiser facilitar o download de endereços de e-mail de usuários via JSON no WordPress de, digamos, um menu de administração ou um submenu?
Uma foto obrigatória de onde estou trabalhando enquanto escrevo este post.
Aqui está uma maneira de resolver esse problema. Observe que ele pressupõe que você tenha algum conhecimento dos itens acima, mas farei o que puder para cobrir cada um dos itens acima.
Baixar endereços de e-mail do usuário via JSON
Antes de começar, observe que estou configurando isso para funcionar sempre que um usuário clicar em um submenu no menu Ferramentas no WordPress.
Como você configura seus ganchos pode variar. Comecei a usar um tipo particular de arquitetura que está se tornando cada vez mais padrão nos projetos que uso para mim e que usamos na Pressware, mas estou divagando sobre isso (talvez eu forneça algumas dicas para isso mais tarde).
De qualquer forma, aqui está o código para adicionar o submenu.
<?php
public function addSubmenuPage()
{
add_submenu_page(
'tools.php',
'Export Emails',
'Export Emails',
'manage_options',
'acme-export-emails',
'exportEmails'
);
}
É exatamente o que você esperaria, certo? Se estiver usando código orientado a objetos, você pode (ou não, novamente, dependendo de como você arquitetou sua solução) precisar usar uma matriz para especificar uma instância da classe atual e seu método.
Observe também que não vou me preocupar com internacionalização no contexto deste post. Não é que não possa ser feito; não é que não seja importante. É uma questão de tentar manter o post o mais enxuto possível.
Registrando o JavaScript
Vou supor que você tenha um arquivo exportEmail.js localizado em seu perfil e este é o arquivo que será responsável por consultar o lado do servidor e retornar o arquivo para download.
A primeira coisa a fazer é registrar com segurança o JavaScript no lado do servidor usando as funções padrão da API :
<?php
public function addJavaScript()
{
if (!current_user_can('manage_options')) {
return;
}
wp_enqueue_script(
'acme-email-export-admin',
$this->plugin_url. 'Emails/assets/scripts/exportEmail.js',
array('jquery')
);
wp_localize_script(
'acme-email-export-admin',
'acme_email_export',
array(
'ajax_url' => admin_url('admin-ajax.php'),
'security' => wp_create_nonce('acme-email-export-nonce')) );
}
Feito isso, você pode escrever o JavaScript que chamará o server-side. Mas esta é uma etapa de duas partes: inclui JavaScript e mais código do lado do servidor.
O lado do cliente chamando o lado do servidor
Como o básico está em vigor para chamar o lado do servidor, é possível configurar o JavaScript agora.
Primeiro, há o manipulador de cliques :
$('a[href="tools.php?page=acme-export-emails"]').on('click', function(evt){
evt.preventDefault();
_getEmailAddresses($(this));
});
A chamada get inicial deve ser algo assim :
var _getEmailAddresses = function($elem) {
$.get(acme_email_export.ajax_url, {
security: acme_email_export.security,
action: 'getEmailAddresses'
}, function(response) {
if ('' === response) {
return;
}
// TODO...
});
};
Observe que ele usa o valor de segurança que criamos anteriormente e, em seguida, usa o nome de outra função, ou seja , getEmailAddresses, que está chamando no lado do servidor.
Essa função é responsável por executar uma consulta, obter os endereços de e-mail e gravar um arquivo JSON temporário para retornar ao usuário.
1 Obtenha os endereços de e-mail dos usuários
Primeiro, WP_User_Query possibilitará a retirada de todos os usuários para determinados critérios.
<?php
private function getUserResults()
{
$query = new WP_User_Query(
array(
'role_in' => array('administrator','subscriber')) );
return $query->get_results();
}
Para os propósitos deste exemplo, obviamente estou esclarecendo os argumentos.
2 Analise o e-mail dos resultados
Em seguida, vou percorrer os resultados e armazenar os endereços de e-mail em uma matriz (que eventualmente converterei em JSON).
<?php
private function getUserInfo($results)
{
$user_info = array();
foreach ($results as $result) {
if (isset($result->user_email)) {
array_push($user_info, $result->user_email);
}
}
return $user_info;
}
Observe que existem outras maneiras de fazer isso. Essa é apenas uma maneira de fazer isso para um conjunto menor de dados, mas se você estiver trabalhando para algo um pouco maior, recomendo uma alternativa (que está além do escopo deste post).
A seguir
Obviamente, esta é apenas a primeira parte de como conectar tudo isso.
No próximo post, abordarei:
- convertendo as informações retornadas em JSON,
- gravando esse arquivo no disco,
- e como unir o resto usando JavaScript.
A etapa final incluirá a criação de um elemento e o acionamento de seu evento de clique para que o usuário seja apresentado à caixa de diálogo de download em vez do texto real em uma janela do navegador.