{"id":229157,"date":"2022-11-13T18:29:00","date_gmt":"2022-11-13T15:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229157"},"modified":"2022-11-09T05:45:25","modified_gmt":"2022-11-09T02:45:25","slug":"faa-anvaendaradresser-i-wordpress-del-1","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/faa-anvaendaradresser-i-wordpress-del-1\/","title":{"rendered":"F\u00e5 anv\u00e4ndaradresser i WordPress, del 1"},"content":{"rendered":"\n<p>S\u00e4g att du arbetar med ett projekt d\u00e4r du vill ge anv\u00e4ndaren m\u00f6jligheten att ladda ner alla e-postadresser fr\u00e5n anv\u00e4ndarna som finns i WordPress-installationen. Visst, detta har n\u00e5gra krav:<\/p>\n<ul>\n<li>Du vill bara att administrat\u00f6rer ska g\u00f6ra det,<\/li>\n<li>Det m\u00e5ste vara s\u00e4kert via nonce-v\u00e4rden,<\/li>\n<li>Svaren ska vara i JSON,<\/li>\n<li>Och du vill anv\u00e4nda JavaScript f\u00f6r att skicka filen n\u00e4r den \u00e4r redo att laddas ner.<\/li>\n<\/ul>\n<p>Vart och ett av ovanst\u00e5ende begrepp har troligen behandlats h\u00e4r tidigare, men vad h\u00e4nder om du vill knyta ihop dem alla? Det vill s\u00e4ga, vad h\u00e4nder om du vill g\u00f6ra det enkelt att ladda ner anv\u00e4ndarnas e-postadresser via JSON inom WordPress fr\u00e5n till exempel en administrationsmeny eller en undermeny?<\/p>\n<p>En obligatorisk bild av var jag jobbar n\u00e4r jag skriver det h\u00e4r inl\u00e4gget.<\/p>\n<p>H\u00e4r \u00e4r ett s\u00e4tt att l\u00f6sa det problemet. Observera att det f\u00f6ruts\u00e4tter att du har viss kunskap om ovanst\u00e5ende, men jag ska g\u00f6ra vad jag kan f\u00f6r att t\u00e4cka vart och ett av ovanst\u00e5ende.<\/p>\n<h2>Ladda ner anv\u00e4ndarens e-postadresser via JSON<\/h2>\n<p>Innan du b\u00f6rjar, notera att jag st\u00e4ller in detta f\u00f6r att fungera n\u00e4r en anv\u00e4ndare klickar p\u00e5 en undermeny under <strong>Verktyg-<\/strong> menyn i WordPress.<\/p>\n<p>Hur du s\u00e4tter upp dina krokar kan variera. Jag har b\u00f6rjat anv\u00e4nda lite av en speciell typ av arkitektur som blir mer och mer standard i de projekt jag anv\u00e4nder b\u00e5de f\u00f6r mig sj\u00e4lv och som vi anv\u00e4nder p\u00e5 <a href=\"https:\/\/pressware.co\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Pressware<\/a>, men jag avviker fr\u00e5n det f\u00f6r detta (kanske jag ska ge lite insikter) in p\u00e5 detta senare).<\/p>\n<h3>L\u00e4gga till en undermeny<\/h3>\n<p>Hur som helst, s\u00e5 h\u00e4r ser koden ut f\u00f6r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-00-add-submenu-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">att l\u00e4gga till undermenyn<\/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>Det \u00e4r precis vad du f\u00f6rv\u00e4ntar dig, eller hur? Om du anv\u00e4nder objektorienterad kod kan du (eller kanske inte, igen, beroende p\u00e5 hur du har utformat din l\u00f6sning) beh\u00f6va anv\u00e4nda en array f\u00f6r att specificera en instans av den aktuella klassen och dess metod.<\/p>\n<p>Observera ocks\u00e5 att jag inte kommer att oroa mig f\u00f6r internationalisering i samband med detta inl\u00e4gg. Det \u00e4r inte s\u00e5 att det inte kan g\u00f6ras; det \u00e4r inte s\u00e5 att det inte \u00e4r viktigt. Det g\u00e4ller att f\u00f6rs\u00f6ka h\u00e5lla inl\u00e4gget s\u00e5 magert som m\u00f6jligt.<\/p>\n<h3>Registrerar JavaScript<\/h3>\n<p>Jag kommer att anta att du har en <strong>exportEmail.js<\/strong> -fil i din profil och det h\u00e4r \u00e4r filen som kommer att ansvara f\u00f6r att fr\u00e5ga serversidan och returnera filen f\u00f6r nedladdning.<\/p>\n<p>Det f\u00f6rsta du ska g\u00f6ra \u00e4r att s\u00e4kert registrera JavaScript p\u00e5 serversidan med hj\u00e4lp <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-01-register-javascript-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">av standard API-funktioner<\/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>N\u00e4r detta \u00e4r gjort kan du skriva JavaScript som kommer att anropa serversidan. Men det h\u00e4r \u00e4r ett tv\u00e5delat steg: Det inkluderar b\u00e5de JavaScript och sedan mer kod p\u00e5 serversidan.<\/p>\n<h3>Klientsidan anropar serversidan<\/h3>\n<p>Eftersom grunderna \u00e4r p\u00e5 plats f\u00f6r att anropa serversidan \u00e4r det m\u00f6jligt att st\u00e4lla in JavaScript nu.<\/p>\n<p>F\u00f6rst \u00e4r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-02-click-handler-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">det klickhanteraren<\/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>Det f\u00f6rsta <strong>get<\/strong> -anropet b\u00f6r se ut ungef\u00e4r s\u00e5 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-03-get-email-addresses-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4r<\/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>L\u00e4gg m\u00e4rke till att den anv\u00e4nder s\u00e4kerhetsv\u00e4rdet vi skapade tidigare och sedan anv\u00e4nder den namnet p\u00e5 en annan funktion, n\u00e4mligen <strong>getEmailAddresses<\/strong>, som den anropar p\u00e5 serversidan.<\/p>\n<p>Den h\u00e4r funktionen \u00e4r ansvarig f\u00f6r att k\u00f6ra en fr\u00e5ga, ta tag i e-postadresserna och skriva en tempor\u00e4r JSON-fil f\u00f6r att \u00e5terv\u00e4nda till anv\u00e4ndaren.<\/p>\n<h4>1 H\u00e4mta anv\u00e4ndarnas e-postadresser<\/h4>\n<p>F\u00f6r det f\u00f6rsta kommer <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a> att g\u00f6ra det m\u00f6jligt att dra tillbaka alla anv\u00e4ndare f\u00f6r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-04-get-email-addresses-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vissa kriterier<\/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>F\u00f6r detta exempel t\u00e4nker jag uppenbarligen l\u00e4tt p\u00e5 argumenten.<\/p>\n<h4>2 Analysera e-postmeddelandet ur resultaten<\/h4>\n<p>D\u00e4refter ska jag iterera igenom resultaten och lagra e-postadresserna <a href=\"https:\/\/gist.github.com\/tommcfarlin\/13576030a7f1f2f62580935c655421b1#file-05-parse-email-results-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i en array<\/a> (som jag s\u00e5 sm\u00e5ningom kommer att konvertera till 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>Observera att det finns andra s\u00e4tt att g\u00f6ra detta. Det h\u00e4r \u00e4r bara ett s\u00e4tt att g\u00f6ra det f\u00f6r en mindre upps\u00e4ttning data, men om du arbetar f\u00f6r n\u00e5got lite st\u00f6rre rekommenderar jag ett alternativ (som ligger utanf\u00f6r ramen f\u00f6r detta inl\u00e4gg).<\/p>\n<h2>Strax<\/h2>\n<p>Uppenbarligen \u00e4r detta bara den f\u00f6rsta delen av hur man kopplar ihop allt detta.<\/p>\n<p>I n\u00e4sta inl\u00e4gg kommer jag att ta upp:<\/p>\n<ul>\n<li>konvertera den returnerade informationen till JSON,<\/li>\n<li>skriva den filen till disk,<\/li>\n<li>och hur man knyter ihop resten av det med JavaScript.<\/li>\n<\/ul>\n<p>Det sista steget kommer att inkludera att skapa ett element och sedan utl\u00f6sa dess klickh\u00e4ndelse s\u00e5 att anv\u00e4ndaren presenteras med nedladdningsdialogrutan snarare \u00e4n den faktiska texten i ett webbl\u00e4sarf\u00f6nster.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vad h\u00e4nder om du vill g\u00f6ra det enkelt att ladda ner anv\u00e4ndarnas e-postadresser via JSON i WordPress fr\u00e5n till exempel en administrationsmeny eller en undermeny?<\/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":[848,807,724,868],"tags":[1173],"class_list":["post-229157","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=229157"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229157\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/224083"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}