{"id":230256,"date":"2022-12-06T16:20:00","date_gmt":"2022-12-06T13:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230256"},"modified":"2022-12-06T16:20:56","modified_gmt":"2022-12-06T13:20:56","slug":"om-att-skriva-laesbara-wordpress-funktioner","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/om-att-skriva-laesbara-wordpress-funktioner\/","title":{"rendered":"Om att skriva l\u00e4sbara WordPress-funktioner"},"content":{"rendered":"\n<p>En av de saker som jag alltid tycker \u00e4r intressant (b\u00e5de ur programmeringssynpunkt och ur WordPress-synpunkt), \u00e4r detta:<\/p>\n<p>Jag gillar att h\u00e5lla koden \u00e5tskild s\u00e5 att koden som \u00e4r ansvarig f\u00f6r att interagera med WordPress f\u00f6rpassas till dess namnomr\u00e5de medan resten av v\u00e5r kod \u00e4r l\u00e4mpligt indelad n\u00e5gon annanstans.<\/p>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/en-enkel-guide-foer-att-organisera-wordpress-centrerade-klasser\/\" title=\"Jag tror dock att detta \u00e4r uppenbart\">Jag tror dock att detta \u00e4r uppenbart<\/a><\/strong>.<\/p>\n<p>N\u00e4r det kommer till att skriva kod betyder det dock inte att det bara m\u00e5ste \u00f6verl\u00e5tas till hur vi skriver v\u00e5ra klasser och sedan organiserar dem. Hur \u00e4r det med saker p\u00e5 en lite mer detaljerad niv\u00e5?<\/p>\n<p>Det vill s\u00e4ga, t\u00e4nk om vi skulle se p\u00e5 metoder som en del av den st\u00f6rre helheten och se till att de ocks\u00e5 g\u00f6r sitt jobb bra? Visst, m\u00e4nniskor som <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Bob Martin<\/a><\/strong> har skrivit om den h\u00e4r typen av saker under st\u00f6rre delen av sin karri\u00e4r och predikat det f\u00f6r m\u00e4nniskor som oss.<\/p>\n<p>Men dessa begrepp \u00e4r n\u00e5got som du helt enkelt b\u00f6rjar g\u00f6ra och sedan till\u00e4mpar dem f\u00f6r gott. Paradigm skiftar, vi \u00e4r b\u00e4ttre idag \u00e4n vi var ig\u00e5r, och det kan finnas flera s\u00e4tt att uppn\u00e5 samma typ av sak.<\/p>\n<p>S\u00e5 n\u00e4r det kommer till att skapa l\u00e4sbara WordPress-funktioner f\u00f6r en specifik dom\u00e4n, hur kan det se ut?<\/p>\n<h2>L\u00e4sbara WordPress-funktioner<\/h2>\n<p>F\u00f6r dem som \u00e4r bekanta med <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLID-<\/a> principerna eller n\u00e5got som talar om att skriva bra kod, \u00e4r en av de saker som m\u00e5nga av de personerna skriver om hur l\u00e5ng en metod ska vara.<\/p>\n<p>Jag tenderar att ta dem som regler snarare \u00e4n lag, f\u00f6r ibland kan metoder helt enkelt inte vara s\u00e5 korta. Jag menar, jag antar att de skulle kunna, men n\u00e5gon g\u00e5ng k\u00e4nns det som mikrohantering av kod, eller hur?<\/p>\n<p>Och att g\u00f6ra n\u00e5got f\u00f6r att g\u00f6ra n\u00e5got \u00e4r en sak, men att g\u00f6ra n\u00e5got f\u00f6r en meningsfull programmering \u00e4r en annan. Jag v\u00e4ljer det senare varje g\u00e5ng.<\/p>\n<p>Hur som helst, s\u00e5 h\u00e4r \u00e4r ett exempel: L\u00e5t oss s\u00e4ga att du har n\u00e5gon kod som anropas via Ajax och innan du forts\u00e4tter med operationen m\u00e5ste du veta om det finns en anpassad posttyp.<\/p>\n<p>Stegen f\u00f6r att g\u00f6ra n\u00e5got liknande kan se ut som f\u00f6ljer:<\/p>\n<ul>\n<li>initiera Ajax-samtalet,<\/li>\n<li>kontrollera s\u00e4kerheten nonce f\u00f6r att verifiera att det \u00e4r en giltig beg\u00e4ran,<\/li>\n<li>kontrollera om data finns,<\/li>\n<li>om det g\u00f6r det, returnera ett framg\u00e5ngsmeddelande; Om inte, returnera ett felmeddelande.<\/li>\n<\/ul>\n<p>Allt detta kan g\u00f6ras inom ett enda meddelande, visst, men l\u00e5t oss anta att vi vill skriva detta i en serie samtal som \u00e4r l\u00e4tta att l\u00e4sa d\u00e4r koden till viss del \u00e4r sj\u00e4lvdokumenterande (det betyder inte att jag Jag \u00e4r emot kommentarer \u2013 det \u00e4r jag inte alls, men det betyder inte att vi vill att v\u00e5r kod ska vara otydlig, eller hur?).<\/p>\n<p>F\u00f6rst, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ajax-uppropet<\/a><\/strong> :<\/p>\n<pre><code>$.get(ajaxurl, {\n    'action': 'getDetails',\n    'security': $('input[name=\"acme-security-nonce\"]').val()\n}, function(response) {\n    if (false === response.success) {\n        \/\/ Handle the case when the request wasn't successful.\n    }\n\n    \/\/ Work with the information that was returned in the response.data property.\n});<\/code><\/pre>\n<p>Sedan <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">har vi en funktion<\/a><\/strong> p\u00e5 serversidan f\u00f6r att explicit verifiera s\u00e4kerheten nonce (detta f\u00f6ruts\u00e4tter naturligtvis att du st\u00e4ller in den korrekt p\u00e5 front-end):<\/p>\n<pre><code>&lt;?php\n\/**\n * @return bool true if we're able to make Ajax requests; otherwise, false\n *\/\nprivate function verifyRequest()\n{\n    return\n        isset($_GET['security']) &amp;&amp;\n        wp_verify_nonce(strip_tags(stripslashes($_GET['security'])), 'getDetails');\n}<\/code><\/pre>\n<p>Efter det vill vi <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kontrollera om data finns:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return bool true if there are details; false, otherwise\n *\n * @access private\n *\/\nprivate function doDetailsExist()\n{\n    return (new WP_Query([\n        'post_type' =&gt; 'acme_post_type',\n        'post_status' =&gt; 'publish',\n    ]))-&gt;have_posts();\n}<\/code><\/pre>\n<p>H\u00e4rifr\u00e5n kan vi sedan arbeta med Ajax responsobjekt genom att utv\u00e4rdera dess framg\u00e5ngsegenskap och reagera d\u00e4refter.<\/p>\n<h2>G\u00e5r ett steg l\u00e4ngre<\/h2>\n<p>L\u00e5t oss dock ta detta ett steg l\u00e4ngre och s\u00e4ga att produkter finns och att vi vill h\u00e4mta alla deras post-ID. Att g\u00f6ra detta med WP_Query \u00e4r ganska enkelt men l\u00e5t oss s\u00e4ga, f\u00f6r kickar, vi vill gr\u00e4nssnittet med databasen direkt.<\/p>\n<p>Observera att detta \u00e4r mer en \u00f6vning f\u00f6r att visa ett s\u00e4tt att g\u00f6ra n\u00e5got snarare \u00e4n att argumentera f\u00f6r att anv\u00e4nda <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb<\/a><\/strong> \u00f6ver <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a>. Det \u00e4r inneh\u00e5ll f\u00f6r ett helt annat inl\u00e4gg.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162675-61e7429944302.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162675-61e7429944302.png\" alt=\"Om att skriva l\u00e4sbara WordPress-funktioner\"><\/a><\/p>\n<p>Hur som helst, s\u00e5 vi har fastst\u00e4llt att data finns. S\u00e5 l\u00e5t oss ta en upps\u00e4ttning av alla inl\u00e4ggs-ID:n och returnera den eller en tom matris. Kanske skulle detta se ut <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ungef\u00e4r s\u00e5 h\u00e4r:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\/**\n * @return array a numerically indexed array of all detail IDs\n*\/\nprivate function getDetailIds(): array\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\"\n        SELECT meta_value\n        FROM $wpdb-&gt;postmeta\n        WHERE meta_key = %s\n        ORDER BY meta_value ASC\n        \", 'acme_detail_number'),\n        ARRAY_N\n    );\n\n    $detailIds = [];\n    array_push($detailIds, array_map(function ($result) {\n        return $result[0];\n    }, $results));\n\n    return $detailIds[0] ?? $detailIds;\n}<\/code><\/pre>\n<p>N\u00e4r v\u00e4rdena har returnerats kan vi sedan operera p\u00e5 dem hur vi finner l\u00e4mpligt.<\/p>\n<h2>Vad \u00e4r syftet med allt detta?<\/h2>\n<p>Generellt sett \u00e4r det f\u00f6r att hj\u00e4lpa oss att t\u00e4nka p\u00e5 kod p\u00e5 ett s\u00e5dant s\u00e4tt att vi kan l\u00e4sa den n\u00e4stan s\u00e5 n\u00e4ra det skrivna ordet som m\u00f6jligt. Det vill s\u00e4ga, vi kan peka p\u00e5 en kodbit som att s\u00e4ga:<\/p>\n<blockquote>\n<p>F\u00f6rst ska vi se om n\u00e5got finns. Om inte, skickar vi ett felmeddelande; annars tar vi tag i data och jobbar sedan med det.<\/p>\n<\/blockquote>\n<p>Visst, jag pratar i mindre konkreta termer h\u00e4r, men det beror p\u00e5 att jag inte n\u00f6dv\u00e4ndigtvis vet vad du jobbar med mer \u00e4n du vet om mitt arbete. Men du fattar, eller hur?<\/p>\n<p>Och dessutom, om du funderar p\u00e5 att enhetstesta kod som \u00e4r frikopplad fr\u00e5n WordPress, kan detta g\u00f6ras genom att anv\u00e4nda gr\u00e4nssnitt som h\u00e5nar funktionerna eller till och med som k\u00f6r direkta fr\u00e5gor mot databasen utan att beh\u00f6va anv\u00e4nda WordPress.<\/p>\n<p>Men, som med n\u00e5gra av punkterna som n\u00e4mns ovan, \u00e4r det \u00e4mnet f\u00f6r ett annat inl\u00e4gg.<\/p>\n<p>Jag h\u00e5ller f\u00f6r n\u00e4rvarande p\u00e5 att skriva en e-bok (tillsammans med en m\u00e4ngd annat premiuminneh\u00e5ll). Om du \u00e4r intresserad, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kolla in vad du f\u00e5r<\/a>.<\/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 inneb\u00e4r det egentligen att skriva l\u00e4sbara WordPress-funktioner? Det finns inte ett enda, perfekt och korrekt r\u00e4tt svar, men det h\u00e4r tillv\u00e4gag\u00e5ngss\u00e4ttet kanske hj\u00e4lper.<\/p>\n","protected":false},"author":1,"featured_media":236179,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[868],"tags":[1173],"class_list":["post-230256","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230256","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=230256"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230256\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}