{"id":229510,"date":"2022-11-13T18:16:00","date_gmt":"2022-11-13T15:16:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229510"},"modified":"2022-11-09T08:15:13","modified_gmt":"2022-11-09T05:15:13","slug":"obtener-direcciones-de-usuario-en-wordpress-parte-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/obtener-direcciones-de-usuario-en-wordpress-parte-1\/","title":{"rendered":"Obtener direcciones de usuario en WordPress, Parte 1"},"content":{"rendered":"\n<p>Supongamos que est\u00e1 trabajando en un proyecto en el que desea brindarle al usuario la capacidad de descargar todas las direcciones de correo electr\u00f3nico de los usuarios que existen en la instalaci\u00f3n de WordPress. De acuerdo, esto tiene algunos requisitos:<\/p>\n<ul>\n<li>Solo quieres que lo hagan los administradores,<\/li>\n<li>Debe ser seguro a trav\u00e9s de valores nonce,<\/li>\n<li>Las respuestas deben estar en JSON,<\/li>\n<li>Y desea usar JavaScript para enviar el archivo cuando est\u00e9 listo para descargar.<\/li>\n<\/ul>\n<p>Es probable que cada uno de los conceptos anteriores se haya cubierto aqu\u00ed antes, pero \u00bfqu\u00e9 sucede si est\u00e1 buscando unirlos todos? Es decir, \u00bfqu\u00e9 sucede si desea facilitar la descarga de las direcciones de correo electr\u00f3nico de los usuarios a trav\u00e9s de JSON dentro de WordPress desde, por ejemplo, un men\u00fa de administraci\u00f3n o un submen\u00fa?<\/p>\n<p>Una foto obligada de donde estoy trabajando mientras escribo este post.<\/p>\n<p>Aqu\u00ed hay una forma de abordar ese problema. Tenga en cuenta que se supone que tiene alg\u00fan conocimiento de lo anterior, pero har\u00e9 lo que pueda para cubrir cada uno de los anteriores.<\/p>\n<h2>Descargar direcciones de correo electr\u00f3nico de usuario a trav\u00e9s de JSON<\/h2>\n<p>Antes de comenzar, tenga en cuenta que estoy configurando esto para que funcione cada vez que un usuario haga clic en un submen\u00fa en el\u00a0 men\u00fa <strong>Herramientas<\/strong> en WordPress.<\/p>\n<p>La forma en que configura sus ganchos puede variar. Comenc\u00e9 a usar un poco de un tipo particular de arquitectura que se est\u00e1 volviendo cada vez m\u00e1s est\u00e1ndar en los proyectos que uso tanto para m\u00ed como para los que usamos en <a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a>, pero estoy divagando sobre eso para esto (tal vez proporcione alguna informaci\u00f3n en esto m\u00e1s tarde).<\/p>\n<h3>Agregar un submen\u00fa<\/h3>\n<p>De todos modos, as\u00ed es como se ve el 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\">agregar el submen\u00fa<\/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>Es exactamente lo que esperar\u00edas, \u00bfverdad? Si est\u00e1 usando c\u00f3digo orientado a objetos, puede (o no, dependiendo de c\u00f3mo haya dise\u00f1ado su soluci\u00f3n) necesitar usar una matriz para especificar una instancia de la clase actual y su m\u00e9todo.<\/p>\n<p>Tenga en cuenta tambi\u00e9n que no me voy a preocupar por la internacionalizaci\u00f3n en el contexto de esta publicaci\u00f3n. No es que no se pueda hacer; no es que no sea importante. Es cuesti\u00f3n de tratar de mantener la publicaci\u00f3n lo m\u00e1s magra posible.<\/p>\n<h3>Registrando el JavaScript<\/h3>\n<p>Voy a suponer que tiene un\u00a0 archivo <strong>exportEmail.js<\/strong> ubicado en su perfil y este es el archivo que ser\u00e1 responsable de consultar el lado del servidor y devolver el archivo para su descarga.<\/p>\n<p>Lo primero que debe hacer es registrar de forma segura el JavaScript en el lado del servidor utilizando <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-01-register-javascript-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">las funciones API est\u00e1ndar<\/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>Una vez hecho esto, puede escribir el JavaScript que llamar\u00e1 al lado del servidor. Pero este es un paso de dos partes: incluye JavaScript y luego m\u00e1s c\u00f3digo del lado del servidor.<\/p>\n<h3>El lado del cliente llamando al lado del servidor<\/h3>\n<p>Dado que los conceptos b\u00e1sicos est\u00e1n establecidos para llamar al lado del servidor, ahora es posible configurar JavaScript.<\/p>\n<p>Primero, est\u00e1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-02-click-handler-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el controlador de clics<\/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>La llamada get<\/strong> inicial deber\u00eda verse <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-03-get-email-addresses-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/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>Tenga en cuenta que usa el valor de seguridad que creamos anteriormente y luego usa el nombre de otra funci\u00f3n, a saber\u00a0, <strong>getEmailAddresses<\/strong>, que est\u00e1 llamando en el lado del servidor.<\/p>\n<p>Esta funci\u00f3n es responsable de ejecutar una consulta, obtener las direcciones de correo electr\u00f3nico y escribir un archivo JSON temporal para devolverlo al usuario.<\/p>\n<h4>1 Obtenga las direcciones de correo electr\u00f3nico de los usuarios<\/h4>\n<p>Primero, <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a> permitir\u00e1 retirar a todos los usuarios para <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-04-get-email-addresses-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ciertos criterios<\/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 los prop\u00f3sitos de este ejemplo, obviamente estoy aclarando los argumentos.<\/p>\n<h4>2 Analice el correo electr\u00f3nico a partir de los resultados<\/h4>\n<p>A continuaci\u00f3n, repetir\u00e9 los resultados y almacenar\u00e9 las direcciones de correo electr\u00f3nico <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-05-parse-email-results-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en una matriz<\/a> (que eventualmente convertir\u00e9 a 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>Tenga en cuenta que hay otras formas de hacer esto. Esta es solo una forma de hacerlo para un conjunto de datos m\u00e1s peque\u00f1o, pero si est\u00e1 trabajando para algo un poco m\u00e1s grande, le recomiendo una alternativa (que est\u00e1 m\u00e1s all\u00e1 del alcance de esta publicaci\u00f3n).<\/p>\n<h2>Hasta la pr\u00f3xima<\/h2>\n<p>Obviamente, esta es solo la primera parte de c\u00f3mo conectar todo esto.<\/p>\n<p>En la pr\u00f3xima publicaci\u00f3n, cubrir\u00e9:<\/p>\n<ul>\n<li>convertir la informaci\u00f3n devuelta en JSON,<\/li>\n<li>escribir ese archivo en el disco,<\/li>\n<li>y c\u00f3mo unir el resto usando JavaScript.<\/li>\n<\/ul>\n<p>El paso final incluir\u00e1 la creaci\u00f3n de un elemento y luego la activaci\u00f3n de su evento de clic para que al usuario se le presente el cuadro de di\u00e1logo de descarga en lugar del texto real en una ventana del navegador.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 sucede si desea facilitar la descarga de las direcciones de correo electr\u00f3nico de los usuarios a trav\u00e9s de JSON dentro de WordPress desde, por ejemplo, un men\u00fa de administraci\u00f3n o un submen\u00fa?<\/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":[716,800,840,861],"tags":[1172],"class_list":["post-229510","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-php-2","category-tutoriales","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229510"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229510\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224083"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}