{"id":229254,"date":"2022-11-13T18:05:00","date_gmt":"2022-11-13T15:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229254"},"modified":"2022-11-09T06:09:45","modified_gmt":"2022-11-09T03:09:45","slug":"uzyskaj-adresy-uzytkownikow-w-wordpress-czesc-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/uzyskaj-adresy-uzytkownikow-w-wordpress-czesc-1\/","title":{"rendered":"Uzyskaj adresy u\u017cytkownik\u00f3w w WordPress, cz\u0119\u015b\u0107 1"},"content":{"rendered":"\n<p>Za\u0142\u00f3\u017cmy, \u017ce pracujesz nad projektem, w kt\u00f3rym chcesz umo\u017cliwi\u0107 u\u017cytkownikowi pobieranie wszystkich adres\u00f3w e-mail od u\u017cytkownik\u00f3w istniej\u0105cych w instalacji WordPress. To prawda, ma to kilka wymaga\u0144:<\/p>\n<ul>\n<li>Chcesz, \u017ceby zrobili to tylko administratorzy,<\/li>\n<li>Musi by\u0107 bezpieczny poprzez warto\u015bci nonce,<\/li>\n<li>Odpowiedzi powinny by\u0107 w formacie JSON,<\/li>\n<li>I chcesz u\u017cy\u0107 JavaScript, aby wys\u0142a\u0107 plik, gdy b\u0119dzie gotowy do pobrania.<\/li>\n<\/ul>\n<p>Ka\u017cda z powy\u017cszych koncepcji zosta\u0142a prawdopodobnie om\u00f3wiona tutaj wcze\u015bniej, ale co, je\u015bli chcesz je wszystkie po\u0142\u0105czy\u0107? To znaczy, co zrobi\u0107, je\u015bli chcesz u\u0142atwi\u0107 pobieranie adres\u00f3w e-mail u\u017cytkownik\u00f3w przez JSON w WordPressie, powiedzmy, z menu administracyjnego lub podmenu?<\/p>\n<p>Obowi\u0105zkowe uj\u0119cie miejsca, w kt\u00f3rym pracuj\u0119 podczas pisania tego posta.<\/p>\n<p>Oto jeden ze sposob\u00f3w rozwi\u0105zania tego problemu. Zauwa\u017c, \u017ce zak\u0142ada, \u017ce \u200b\u200bmasz pewn\u0105 wiedz\u0119 na temat powy\u017cszego, ale zrobi\u0119, co w mojej mocy, aby om\u00f3wi\u0107 ka\u017cdy z powy\u017cszych.<\/p>\n<h2>Pobierz adresy e-mail u\u017cytkownik\u00f3w przez JSON<\/h2>\n<p>Zanim zaczniesz, pami\u0119taj, \u017ce konfiguruj\u0119 to tak, aby dzia\u0142a\u0142o za ka\u017cdym razem, gdy u\u017cytkownik kliknie podmenu w\u00a0 menu <strong>Narz\u0119dzia<\/strong> w WordPress.<\/p>\n<p>Spos\u00f3b konfiguracji haczyk\u00f3w mo\u017ce si\u0119 r\u00f3\u017cni\u0107. Zacz\u0105\u0142em u\u017cywa\u0107 nieco szczeg\u00f3lnego rodzaju architektury, kt\u00f3ra staje si\u0119 coraz bardziej standardowa w projektach, kt\u00f3rych u\u017cywam zar\u00f3wno dla siebie, jak i w <a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a>, ale w tym celu dygresj\u0119 (by\u0107 mo\u017ce przedstawi\u0119 troch\u0119 wgl\u0105du do tego p\u00f3\u017aniej).<\/p>\n<h3>Dodawanie podmenu<\/h3>\n<p>W ka\u017cdym razie, oto jak wygl\u0105da kod <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-00-add-submenu-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dodawania podmenu<\/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>To jest dok\u0142adnie to, czego mo\u017cna si\u0119 spodziewa\u0107, prawda? Je\u015bli u\u017cywasz kodu zorientowanego obiektowo, mo\u017cesz (lub nie, ponownie, w zale\u017cno\u015bci od sposobu zaprojektowania rozwi\u0105zania) u\u017cy\u0107 tablicy do okre\u015blenia wyst\u0105pienia bie\u017c\u0105cej klasy i jej metody.<\/p>\n<p>Zauwa\u017c te\u017c, \u017ce nie b\u0119d\u0119 si\u0119 martwi\u0142 o internacjonalizacj\u0119 w kontek\u015bcie tego postu. Nie chodzi o to, \u017ce nie da si\u0119 tego zrobi\u0107; nie chodzi o to, \u017ce to nie jest wa\u017cne. To kwestia starania si\u0119, aby post by\u0142 jak najcie\u0144szy.<\/p>\n<h3>Rejestracja JavaScript<\/h3>\n<p>Zak\u0142adam, \u017ce w swoim profilu znajduje si\u0119 plik <strong>exportEmail.js, kt\u00f3ry b\u0119dzie odpowiedzialny za wysy\u0142anie zapyta\u0144 po stronie serwera i zwracanie pliku do pobrania.<\/strong><\/p>\n<p>Pierwsz\u0105 rzecz\u0105, kt\u00f3r\u0105 nale\u017cy zrobi\u0107, to bezpiecznie zarejestrowa\u0107 JavaScript po stronie serwera za pomoc\u0105 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-01-register-javascript-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">standardowych funkcji 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>Gdy to zrobisz, mo\u017cesz napisa\u0107 JavaScript, kt\u00f3ry wywo\u0142a stron\u0119 serwera. Ale jest to krok dwucz\u0119\u015bciowy: zawiera zar\u00f3wno JavaScript, jak i wi\u0119cej kodu po stronie serwera.<\/p>\n<h3>Po\u0142\u0105czenie po stronie klienta po stronie serwera<\/h3>\n<p>Poniewa\u017c podstawy s\u0105 ju\u017c gotowe do wywo\u0142ywania po stronie serwera, mo\u017cna teraz skonfigurowa\u0107 JavaScript.<\/p>\n<p>Po pierwsze, jest <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-02-click-handler-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">modu\u0142 obs\u0142ugi klikni\u0119\u0107<\/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>Pierwsze\u00a0 wywo\u0142anie <strong>get<\/strong> powinno wygl\u0105da\u0107 mniej wi\u0119cej <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-03-get-email-addresses-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tak<\/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>Zauwa\u017c, \u017ce u\u017cywa warto\u015bci bezpiecze\u0144stwa, kt\u00f3r\u0105 stworzyli\u015bmy wcze\u015bniej, a nast\u0119pnie u\u017cywa nazwy innej funkcji, a mianowicie <strong>getEmailAddresses<\/strong>, kt\u00f3r\u0105 wywo\u0142uje po stronie serwera.<\/p>\n<p>Ta funkcja jest odpowiedzialna za uruchomienie zapytania, pobranie adres\u00f3w e-mail i zapisanie tymczasowego pliku JSON, aby powr\u00f3ci\u0107 do u\u017cytkownika.<\/p>\n<h4>1 Uzyskaj adresy e-mail u\u017cytkownik\u00f3w<\/h4>\n<p>Po pierwsze, <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a> umo\u017cliwi wycofanie wszystkich u\u017cytkownik\u00f3w dla <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-04-get-email-addresses-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">okre\u015blonych kryteri\u00f3w<\/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>Na potrzeby tego przyk\u0142adu, oczywi\u015bcie, lekcewa\u017c\u0119 argumenty.<\/p>\n<h4>2 Przeanalizuj wiadomo\u015b\u0107 e-mail z wynik\u00f3w<\/h4>\n<p>Nast\u0119pnie przejd\u0119 przez wyniki i przechowam adresy 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\">w tablicy<\/a> (kt\u00f3r\u0105 ostatecznie przekonwertuj\u0119 na 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>Zauwa\u017c, \u017ce s\u0105 na to inne sposoby. To tylko jeden spos\u00f3b na zrobienie tego dla mniejszego zestawu danych, ale je\u015bli pracujesz nad czym\u015b nieco wi\u0119kszym, polecam alternatyw\u0119 (kt\u00f3ra wykracza poza zakres tego postu).<\/p>\n<h2>W przysz\u0142ym<\/h2>\n<p>Oczywi\u015bcie to tylko pierwsza cz\u0119\u015b\u0107 tego, jak to wszystko po\u0142\u0105czy\u0107.<\/p>\n<p>W nast\u0119pnym po\u015bcie om\u00f3wi\u0119:<\/p>\n<ul>\n<li>konwersja zwr\u00f3conych informacji do formatu JSON,<\/li>\n<li>zapisanie tego pliku na dysku,<\/li>\n<li>i jak powi\u0105za\u0107 reszt\u0119 za pomoc\u0105 JavaScript.<\/li>\n<\/ul>\n<p>Ostatnim krokiem b\u0119dzie utworzenie elementu, a nast\u0119pnie wywo\u0142anie zdarzenia klikni\u0119cia, dzi\u0119ki czemu u\u017cytkownikowi zostanie wy\u015bwietlone okno dialogowe pobierania, a nie rzeczywisty tekst w oknie przegl\u0105darki.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Co zrobi\u0107, je\u015bli chcesz u\u0142atwi\u0107 pobieranie adres\u00f3w e-mail u\u017cytkownik\u00f3w przez JSON w WordPressie, powiedzmy, z menu administracyjnego lub podmenu?<\/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":[721,805,845,866],"tags":[1169],"class_list":["post-229254","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-php-7","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=229254"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/224083"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}