{"id":231115,"date":"2022-12-27T11:38:00","date_gmt":"2022-12-27T08:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231115"},"modified":"2022-12-27T12:03:24","modified_gmt":"2022-12-27T09:03:24","slug":"databasfraagor-foer-att-snabbt-uppdatera-data-del-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/databasfraagor-foer-att-snabbt-uppdatera-data-del-2\/","title":{"rendered":"Databasfr\u00e5gor f\u00f6r att snabbt uppdatera data, del 2"},"content":{"rendered":"\n<p>Detta \u00e4r den andra, och sista delen, i en serie om \u2013 som titeln antyder \u2013 direkta databasfr\u00e5gor. Specifikt handlar det om att \u00e4ndra inl\u00e4ggsstatus (men det \u00e4r relevant f\u00f6r mer \u00e4n s\u00e5).<\/p>\n<p>Foto av Ross Findon p\u00e5 Unsplash<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/databasfraagor-foer-att-snabbt-uppdatera-data-del-1\/\" title=\"Fr\u00e5n f\u00f6rra inl\u00e4gget:\">Fr\u00e5n f\u00f6rra inl\u00e4gget:<\/a><\/p>\n<blockquote>\n<p>Detta \u00e4r \u00e4nnu ett inl\u00e4gg som kommer att vara en illustration av hur man anv\u00e4nder $wpdb f\u00f6r att snabbt uppdatera information baserat p\u00e5 metadata.<\/p>\n<\/blockquote>\n<p>Och koden i det inl\u00e4gget fungerar men om du vill g\u00f6ra den mer objektorienterad finns det mer arbete som kan g\u00f6ras.<\/p>\n<p>Innan du hoppar in i sj\u00e4lva inl\u00e4gget \u00e4r det dock viktigt att notera att n\u00e4r det kommer till objektorienterad programmering, finns det mycket arbete som kan l\u00e4ggas ner p\u00e5 klassdesignen och skapa abstraktionsniv\u00e5er.<\/p>\n<p>Vid n\u00e5got tillf\u00e4lle m\u00e5ste du dra den \u00f6k\u00e4nda gr\u00e4nsen mellan n\u00e4r du ska anv\u00e4nda gr\u00e4nssnitt, hur granul\u00e4ra dina klasser kommer att vara i termer av vad de abstraherar och liknande.<\/p>\n<p>Och syftet med det h\u00e4r inl\u00e4gget \u00e4r att hj\u00e4lpa till att ge en b\u00e4ttre objektorienterad design men det \u00e4r inte en \u00f6vning som g\u00f6r detta s\u00e5 optimalt som m\u00f6jligt. Jag diskuterar s\u00e5dana h\u00e4r \u00e4mnen i <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">en annan serie inl\u00e4gg<\/a>.<\/p>\n<p>Men t\u00e4nk p\u00e5 det n\u00e4r du l\u00e4ser igenom koden under resten av inl\u00e4gget.<\/p>\n<h2>Databasfr\u00e5gor f\u00f6r att snabbt uppdatera data, del 2<\/h2>\n<p>Med tanke p\u00e5 var vi slutade har vi en enda funktion som g\u00f6r f\u00f6ljande:<\/p>\n<ol>\n<li>h\u00e4mta alla inl\u00e4gg som \u00e4r associerade med en specifik metanyckel,<\/li>\n<li>avg\u00f6ra om vi beh\u00f6ver l\u00e4mna tidigt,<\/li>\n<li>uppdatera inl\u00e4ggsstatusen f\u00f6r alla befintliga inl\u00e4gg.<\/li>\n<\/ol>\n<p>Det f\u00f6rsta att notera \u00e4r att en enskild funktion \u00e4r f\u00f6r mycket, s\u00e5 den m\u00e5ste delas upp i flera andra funktioner. Och eftersom det \u00e4r objektorienterat m\u00e5ste vi se till att vad en funktion \u00e4n g\u00f6r inte n\u00f6dv\u00e4ndigtvis baseras p\u00e5 tidigare steg \u2013 det \u00e4r precis vad procedurprogrammering handlar om.<\/p>\n<p>Ist\u00e4llet kommer vi att anv\u00e4nda den h\u00e4r m\u00f6jligheten f\u00f6r att st\u00e4lla in funktioner, s\u00e5 att de fungerar p\u00e5 vilken data som skickas till dem oavsett hur de kom dit.<\/p>\n<p>Slutligen \u00e4r det upp till dig, som utvecklare, att avg\u00f6ra om du vill ha en enda klass f\u00f6r att g\u00f6ra detta, mer \u00e4n en klass, eller ha en upps\u00e4ttning relaterade klasser som \u00e4rver fr\u00e5n en \u00f6verordnad klass.<\/p>\n<p>\u00c5terigen, det handlar om hur abstrakt du vill g\u00f6ra koden.<\/p>\n<p>F\u00f6r nu, men l\u00e5t oss g\u00e5 vidare med att bryta upp saker.<\/p>\n<h3>1 Ta tag i inl\u00e4ggs-ID:n med den associerade metanyckeln<\/h3>\n<p>Precis som i det f\u00f6rsta inl\u00e4gget vill vi se till att vi h\u00e4mtar inl\u00e4ggs-ID:n som \u00e4r relaterade till en specifik metanyckel.<\/p>\n<p>F\u00f6r att g\u00f6ra den h\u00e4r funktionen s\u00e5 flexibel som m\u00f6jligt st\u00e4ller vi in \u200b\u200bden till:<\/p>\n<ul>\n<li>acceptera meta-nyckeln som en str\u00e4ng,<\/li>\n<li>returnera en array<\/li>\n<\/ul>\n<p>Funktionen kommer d\u00e5 att se ut ungef\u00e4r <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-00-get-inactive-post-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Locates all of the post IDs that are associated with an empty meta key (which\n * is specified as an argument for the function).\n *\n * @param string $metaKey The meta key used to retrieve the set of post IDs.\n * @return array $results The set of product IDs associated with the specified meta key.\n *\/\npublic function getInactivePostIds(string $metaKey): array\n{\n    global $wpdb;\n\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT post_id\n            FROM $wpdb-&gt;postmeta\n            WHERE meta_key = %s\n            AND meta_value = ''\n            \",\n            $metaKey) );\n\n    return $results;\n}<\/code><\/pre>\n<p>I det f\u00f6rsta inl\u00e4gget delade vi upp detta i tre steg (som ocks\u00e5 beskrivs ovan). H\u00e4r kan vi dock kombinera det andra och tredje steget till en enda funktion.<\/p>\n<h3>2 Uppdatera poststatus<\/h3>\n<p>Som jag n\u00e4mnde \u00e4r den ena aspekten av objektorienterad programmering att se till att funktionerna vi anv\u00e4nder \u00e4r agnostiska om hur data genererades som de tar emot.<\/p>\n<p>Ist\u00e4llet har de en enda algoritm att k\u00f6ra f\u00f6r att fokusera p\u00e5 data som skickas till funktionen. I det h\u00e4r fallet vill vi ta upps\u00e4ttningen resultat \u2013 som \u00e4r inl\u00e4ggs-ID:n \u2013 och uppdatera deras inl\u00e4ggsstatus s\u00e5 att den \u00e4r inst\u00e4lld p\u00e5 <strong>utkast<\/strong>.<\/p>\n<p>Detta inneb\u00e4r att funktionen accepterar en array men inte returnerar n\u00e5got. Potentiellt skulle du kunna l\u00e5ta den h\u00e5lla reda p\u00e5 m\u00e5nga inl\u00e4gg som den uppdaterade (eller om den uppdaterade n\u00e5got alls), men jag \u00e4r fokuserad p\u00e5 att bara omstrukturera koden vi redan har.<\/p>\n<p>S\u00e5 det \u00e4r vad vi ska g\u00f6ra. Och det f\u00f6rsta \u00e4r att se till att det finns faktiska data att arbeta med. Och om s\u00e5 \u00e4r fallet, iterera genom listan med inl\u00e4ggs-ID:n och <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-01-set-posts-to-draft-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e4ndra deras inl\u00e4ggsstatus:<\/a><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Updates incoming posts by setting their post status to 'draft.'\n *\n * @param array $postData the set of post IDs associated with the specific meta key.\n *\/\npublic function setPostsToDraft(array $postData)\n{\n    \/\/ If the post data is empty, there's nothing to do.\n    if (0 === count($postData)) {\n        return;\n    }\n\n    \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n    global $wpdb;\n    foreach ($postData as $post) {\n        $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                UPDATE $wpdb-&gt;posts\n                SET post_status = %s\n                WHERE ID = %d\n                \",\n                'draft',\n                (int) ($post-&gt;post_id)) );\n    }\n}<\/code><\/pre>\n<p>Du kan se att det inte skiljer sig mycket fr\u00e5n det arbete som har gjorts i det f\u00f6rsta inl\u00e4gget, men det v\u00e4cker nu n\u00e5gra fr\u00e5gor.<\/p>\n<h3>3 Objektorienterade \u00f6verv\u00e4ganden<\/h3>\n<p>N\u00e4r du arbetar med kod s\u00e5 h\u00e4r:<\/p>\n<ul>\n<li>H\u00f6r allt hemma i samma klass eller separata klasser?<\/li>\n<li>Ska det finnas en basklass och i s\u00e5 fall varf\u00f6r eller varf\u00f6r inte?<\/li>\n<li>B\u00f6r det finnas en enda offentlig funktion som anropas som anropar dessa metoder (och har dem markerade som privata)?<\/li>\n<li>Ska vi l\u00e4mna funktionerna offentliga?<\/li>\n<\/ul>\n<p>F\u00f6r det h\u00e4r inl\u00e4gget kommer jag att g\u00f6ra f\u00f6ljande:<\/p>\n<ul>\n<li><strong>Exponera varje funktion som en offentlig metod<\/strong>. Detta \u00e4r s\u00e5 att om det finns data som returneras fr\u00e5n den f\u00f6rsta metoden, kan du potentiellt g\u00f6ra n\u00e5got annat med den.<\/li>\n<li><strong>H\u00e5ll det i en enda klass<\/strong>. P\u00e5 s\u00e5 s\u00e4tt kan vi instansiera en enskild klass och sedan anv\u00e4nda den f\u00f6r att g\u00f6ra allt vi beh\u00f6ver g\u00f6ra. Om det fanns andra metoder skulle vi anv\u00e4nda samma metoder.<\/li>\n<li><strong>B\u00f6rja med gr\u00e4nssnittet<\/strong>. Jag t\u00e4nker inte bry mig om att skriva ett gr\u00e4nssnitt i syfte att bara visa ett gr\u00e4nssnitt (jag antar att det \u00e4r l\u00e4tt nog att h\u00e4rleda med tanke p\u00e5 de funktioner vi har just nu), men jag ska ta klassen och visa hur vi kan \u00e5beropa fungerar &quot;fr\u00e5n utsidan och in&quot;.<\/li>\n<\/ul>\n<p>S\u00e5 jag ska b\u00f6rja med <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-02-invoking-the-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den sista punkten<\/a> och jobba bakl\u00e4nges. H\u00e4r \u00e4r ett s\u00e4tt att arbeta med koden:<\/p>\n<pre><code>&lt;?php\n\n$postStatusModifier = new PostStatusModifier();\n$inactivePost = $postStatusModifier-&gt;getInactivePostIds('acme-status');\n$postStatusModifier-&gt;setPostsToDraft($inactivePosts);<\/code><\/pre>\n<p>Och s\u00e5 h\u00e4r ser <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-03-post-status-modifier-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hela klassen<\/a> ut:<\/p>\n<pre><code>&lt;?php\n\nclass PostStatusModifier\n{\n    \/**\n     * Locates all of the post IDs that are associated with an empty meta key (which\n     * is specified as an argument for the function).\n     *\n     * @param string $metaKey The meta key used to retrieve the set of post IDs.\n     * @return array $results The set of product IDs associated with the specified meta key.\n     *\/\n    public function getInactivePostIds(string $metaKey): array\n    {\n        global $wpdb;\n\n        $results = $wpdb-&gt;get_results(\n            $wpdb-&gt;prepare(\n                \"\n                SELECT post_id\n                FROM $wpdb-&gt;postmeta\n                WHERE meta_key = %s\n                AND meta_value = ''\n                \",\n                $metaKey) );\n\n        return $results;\n    }\n\n    \/**\n     * Updates incoming posts by setting their post status to 'draft.'\n     *\n     * @param array $postData the set of post IDs associated with the specific meta key.\n     *\/\n    public function setPostsToDraft(array $postData)\n    {\n        \/\/ If the post data is empty, there's nothing to do.\n        if (0 === count($postData)) {\n            return;\n        }\n\n        \/\/ Otherwise, set the post_status of the specified post IDs to 'draft'.\n        global $wpdb;\n        foreach ($postData as $post) {\n            $wpdb-&gt;get_results(\n                $wpdb-&gt;prepare(\n                    \"\n                    UPDATE $wpdb-&gt;posts\n                    SET post_status = %s\n                    WHERE ID = %d\n                    \",\n                    'draft',\n                    (int) ($post-&gt;post_id)) );\n        }\n    }\n}<\/code><\/pre>\n<p>Generellt sett kommer det att tj\u00e4na samma syften som de f\u00f6rsta men p\u00e5 ett mer objektorienterat s\u00e4tt.<\/p>\n<h2>Det \u00e4r inte v\u00e4gen<\/h2>\n<p>Eftersom jag har f\u00f6rs\u00f6kt upprepa flera g\u00e5nger genom det h\u00e4r inl\u00e4gget, \u00e4r detta inte det definitiva s\u00e4ttet att g\u00f6ra detta arbete. Ist\u00e4llet \u00e4r det ett s\u00e4tt att arbeta p\u00e5.<\/p>\n<p>Du kan designa om, re-faktorera eller \u00e5teranv\u00e4nda detta hur du vill. Syftet \u00e4r dock att visa hur man kopplar bort logik som vi normalt ser som processuell till n\u00e5got som \u00e4r lite mindre beroende av sig sj\u00e4lv och l\u00e4mnar utrymme f\u00f6r ytterligare arbete.<\/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>Anv\u00e4nda objektorienterade principer f\u00f6r att f\u00f6rb\u00e4ttra klassdesignen f\u00f6r att skriva databasfr\u00e5gor f\u00f6r att snabbt uppdatera data.<\/p>\n","protected":false},"author":1,"featured_media":237043,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[838,848,901,922,724],"tags":[1173],"class_list":["post-231115","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-handledningar","category-koda","category-oevrig","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231115","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=231115"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/231115\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/237043"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=231115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=231115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=231115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}