{"id":229929,"date":"2022-11-13T18:34:00","date_gmt":"2022-11-13T15:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229929"},"modified":"2022-11-09T19:20:05","modified_gmt":"2022-11-09T16:20:05","slug":"hanki-kaeyttaejaeosoitteita-wordpressissae-osa-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/hanki-kaeyttaejaeosoitteita-wordpressissae-osa-1\/","title":{"rendered":"Hanki k\u00e4ytt\u00e4j\u00e4osoitteita WordPressiss\u00e4, osa 1"},"content":{"rendered":"\n<p>Oletetaan, ett\u00e4 ty\u00f6skentelet projektin parissa, jossa haluat antaa k\u00e4ytt\u00e4j\u00e4lle mahdollisuuden ladata kaikki WordPress-asennuksessa olevien k\u00e4ytt\u00e4jien s\u00e4hk\u00f6postiosoitteet. My\u00f6nnett\u00e4k\u00f6\u00f6n, ett\u00e4 t\u00e4ll\u00e4 on muutamia vaatimuksia:<\/p>\n<ul>\n<li>Haluat vain j\u00e4rjestelm\u00e4nvalvojien tekev\u00e4n sen,<\/li>\n<li>Sen on oltava turvallinen nonce-arvojen avulla,<\/li>\n<li>Vastausten tulee olla JSON-muodossa,<\/li>\n<li>Ja haluat k\u00e4ytt\u00e4\u00e4 JavaScripti\u00e4 tiedoston l\u00e4hett\u00e4miseen, kun se on valmis ladattavaksi.<\/li>\n<\/ul>\n<p>Jokainen yll\u00e4 olevista k\u00e4sitteist\u00e4 on todenn\u00e4k\u00f6isesti k\u00e4sitelty t\u00e4\u00e4ll\u00e4 aiemmin, mutta ent\u00e4 jos haluat yhdist\u00e4\u00e4 ne kaikki yhteen? Eli ent\u00e4 jos haluat helpottaa k\u00e4ytt\u00e4jien s\u00e4hk\u00f6postiosoitteiden lataamista JSONin kautta WordPressiss\u00e4 esimerkiksi hallintavalikosta tai alivalikosta?<\/p>\n<p>Pakollinen kuva ty\u00f6paikastani t\u00e4t\u00e4 postausta kirjoittaessani.<\/p>\n<p>T\u00e4ss\u00e4 on yksi tapa ratkaista t\u00e4m\u00e4 ongelma. Huomaa, ett\u00e4 se edellytt\u00e4\u00e4, ett\u00e4 sinulla on jonkin verran tietoa yll\u00e4 olevista, mutta teen kaikkeni kattaakseni kaikki edell\u00e4 mainitut.<\/p>\n<h2>Lataa k\u00e4ytt\u00e4jien s\u00e4hk\u00f6postiosoitteet JSON:n kautta<\/h2>\n<p>Ennen kuin aloitat, huomaa, ett\u00e4 m\u00e4\u00e4rit\u00e4n t\u00e4m\u00e4n toimimaan aina, kun k\u00e4ytt\u00e4j\u00e4 napsauttaa WordPressin <strong>Ty\u00f6kalut -valikon alivalikkoa.<\/strong><\/p>\n<p>Tapa, jolla asetat koukut, voi vaihdella. Olen alkanut k\u00e4ytt\u00e4\u00e4 v\u00e4h\u00e4n tietyntyyppist\u00e4 arkkitehtuuria, josta on tulossa yh\u00e4 vakiomuotoisempi projekteissa, joita k\u00e4yt\u00e4n sek\u00e4 itsess\u00e4ni ett\u00e4 <a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Presswaressa<\/a>, mutta poikkean siit\u00e4 t\u00e4ss\u00e4 (ehk\u00e4 annan jonkinlaisen k\u00e4sityksen t\u00e4h\u00e4n my\u00f6hemmin).<\/p>\n<h3>Alivalikon lis\u00e4\u00e4minen<\/h3>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-00-add-submenu-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Joka tapauksessa alivalikon lis\u00e4\u00e4misen<\/a> koodi n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4 .<\/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>Se on juuri sit\u00e4 mit\u00e4 odotit, eik\u00f6? Jos k\u00e4yt\u00e4t oliopohjaista koodia, saatat joutua k\u00e4ytt\u00e4m\u00e4\u00e4n taulukkoa m\u00e4\u00e4ritt\u00e4m\u00e4\u00e4n nykyisen luokan esiintym\u00e4n ja sen menetelm\u00e4n (tai ei, riippuen siit\u00e4, miten olet rakentanut ratkaisusi).<\/p>\n<p>Huomaa my\u00f6s, ett\u00e4 en aio olla huolissani kansainv\u00e4listymisest\u00e4 t\u00e4m\u00e4n postauksen yhteydess\u00e4. Kyse ei ole siit\u00e4, etteik\u00f6 sit\u00e4 voisi tehd\u00e4; se ei tarkoita, etteik\u00f6 se olisi t\u00e4rke\u00e4\u00e4. On yritett\u00e4v\u00e4 pit\u00e4\u00e4 viesti mahdollisimman laimeana.<\/p>\n<h3>JavaScriptin rekister\u00f6inti<\/h3>\n<p>Oletan, ett\u00e4 profiilissasi on <strong>exportEmail.js<\/strong> -tiedosto, ja t\u00e4m\u00e4 tiedosto vastaa kyselyn tekemisest\u00e4 palvelinpuolelta ja tiedoston palauttamisesta ladattavaksi.<\/p>\n<p>Ensimm\u00e4inen asia, joka sinun tulee tehd\u00e4, on rekister\u00f6id\u00e4 JavaScript turvallisesti palvelimen puolella k\u00e4ytt\u00e4m\u00e4ll\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-01-register-javascript-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">standardi API-toimintoja<\/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>Kun t\u00e4m\u00e4 on tehty, voit kirjoittaa JavaScriptin, joka kutsuu palvelinpuolen. Mutta t\u00e4m\u00e4 on kaksiosainen vaihe: Se sis\u00e4lt\u00e4\u00e4 sek\u00e4 JavaScriptin ett\u00e4 lis\u00e4\u00e4 palvelinpuolen koodia.<\/p>\n<h3>Asiakaspuoli soittaa palvelinpuolelle<\/h3>\n<p>Koska palvelinpuolen kutsumisen perusteet ovat kunnossa, on mahdollista m\u00e4\u00e4ritt\u00e4\u00e4 JavaScript nyt.<\/p>\n<p>Ensinn\u00e4kin on <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-02-click-handler-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">napsautusten k\u00e4sittelij\u00e4<\/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>Ensimm\u00e4isen <strong>soittopyynn\u00f6n<\/strong> pit\u00e4isi n\u00e4ytt\u00e4\u00e4 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-03-get-email-addresses-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4lt\u00e4<\/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>Huomaa, ett\u00e4 se k\u00e4ytt\u00e4\u00e4 aiemmin luomaamme suojausarvoa ja sitten toisen funktion nime\u00e4, nimitt\u00e4in <strong>getEmailAddresses<\/strong>, jota se kutsuu palvelinpuolella.<\/p>\n<p>T\u00e4m\u00e4 toiminto vastaa kyselyn suorittamisesta, s\u00e4hk\u00f6postiosoitteiden nappaamisesta ja v\u00e4liaikaisen JSON-tiedoston kirjoittamisesta, joka palautetaan k\u00e4ytt\u00e4j\u00e4lle.<\/p>\n<h4>1 Hanki k\u00e4ytt\u00e4jien s\u00e4hk\u00f6postiosoitteet<\/h4>\n<p>Ensinn\u00e4kin <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a> mahdollistaa kaikkien k\u00e4ytt\u00e4jien vet\u00e4misen takaisin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-04-get-email-addresses-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tiettyjen ehtojen<\/a> mukaisesti .<\/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>T\u00e4m\u00e4n esimerkin tarkoituksia varten otan selv\u00e4\u00e4 perusteluista.<\/p>\n<h4>2 J\u00e4senn\u00e4 s\u00e4hk\u00f6posti tuloksista<\/h4>\n<p>Seuraavaksi aion iteroida tuloksia ja tallentaa s\u00e4hk\u00f6postiosoitteet <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-05-parse-email-results-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">taulukkoon<\/a> (jonka muunnan lopulta JSONiksi).<\/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>Huomaa, ett\u00e4 on muita tapoja tehd\u00e4 t\u00e4m\u00e4. T\u00e4m\u00e4 on vain yksi tapa tehd\u00e4 se pienemm\u00e4lle datajoukolle, mutta jos ty\u00f6skentelet jonkin verran suuremman kanssa, suosittelen vaihtoehtoa (joka ei kuulu t\u00e4m\u00e4n viestin piiriin).<\/p>\n<h2>Seuraavaksi<\/h2>\n<p>Ilmeisesti t\u00e4m\u00e4 on vain ensimm\u00e4inen osa siit\u00e4, kuinka t\u00e4m\u00e4 kaikki kytket\u00e4\u00e4n.<\/p>\n<p>Seuraavassa postauksessa k\u00e4sittelen:<\/p>\n<ul>\n<li>muuntaa palautetut tiedot JSON-muotoon,<\/li>\n<li>tiedoston kirjoittaminen levylle,<\/li>\n<li>ja kuinka sitoa loput yhteen JavaScriptin avulla.<\/li>\n<\/ul>\n<p>Viimeinen vaihe sis\u00e4lt\u00e4\u00e4 elementin luomisen ja sitten sen napsautustapahtuman k\u00e4ynnist\u00e4misen, jotta k\u00e4ytt\u00e4j\u00e4lle n\u00e4ytet\u00e4\u00e4n latausikkuna eik\u00e4 varsinainen teksti selainikkunassa.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ent\u00e4 jos haluat helpottaa k\u00e4ytt\u00e4jien s\u00e4hk\u00f6postiosoitteiden lataamista JSONin kautta WordPressiss\u00e4 esimerkiksi hallintavalikosta tai alivalikosta?<\/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":[719,843,803,864],"tags":[1166],"class_list":["post-229929","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-opetusohjelmia","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=229929"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/229929\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/224083"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=229929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=229929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=229929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}