{"id":231159,"date":"2022-12-27T12:02:00","date_gmt":"2022-12-27T09:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231159"},"modified":"2022-12-27T12:29:56","modified_gmt":"2022-12-27T09:29:56","slug":"andmebaasipaeringud-andmete-kiireks-vaerskendamiseks-2-osa","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/andmebaasipaeringud-andmete-kiireks-vaerskendamiseks-2-osa\/","title":{"rendered":"Andmebaasip\u00e4ringud andmete kiireks v\u00e4rskendamiseks, 2. osa"},"content":{"rendered":"\n<p>See on teine \u200b\u200bja viimane osa seeriast, mis k\u00e4sitleb \u2013 nagu pealkiri viitab \u2013 otseseid andmebaasip\u00e4ringuid. T\u00e4psemalt, see puudutab postituste olekute muutmist (kuid see on asjakohane rohkem kui selle jaoks).<\/p>\n<p>Foto Ross Findon Unsplashist<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/et\/andmebaasipaeringud-andmete-kiireks-vaerskendamiseks-1-osa\/\" title=\"Eelmisest postitusest:\">Eelmisest postitusest:<\/a><\/p>\n<blockquote>\n<p>See on j\u00e4rjekordne postitus, mis illustreerib, kuidas kasutada $wpdb-d metaandmetel p\u00f5hineva teabe kiireks v\u00e4rskendamiseks.<\/p>\n<\/blockquote>\n<p>Ja selles postituses olev kood t\u00f6\u00f6tab, kuid kui soovite muuta selle objektorienteeritumaks, on veel palju t\u00f6\u00f6d teha.<\/p>\n<p>Enne tegeliku postituse juurde h\u00fcppamist on siiski oluline m\u00e4rkida, et kui tegemist on objektorienteeritud programmeerimisega, on klassi kujundamisel ja abstraktsioonitasemete loomisel palju t\u00f6\u00f6d.<\/p>\n<p>Mingil hetkel peate t\u00f5mbama vanas\u00f5nalise piiri selle vahele, millal kavatsete liideseid kasutada, kui \u00fcksikasjalikud on teie klassid nende abstraktsioonide ja muu sarnase vahel.<\/p>\n<p>Ja selle postituse eesm\u00e4rk on aidata pakkuda paremat objektorienteeritud disaini, kuid see pole harjutus, mis muudab selle v\u00f5imalikult optimaalseks. Ma arutan selliseid teemasid <a href=\"https:\/\/tommcfarlin.com\/tag\/object-oriented-programming-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">teises postituste sarjas<\/a>.<\/p>\n<p>Kuid pidage seda meeles, kui lugesite kogu \u00fclej\u00e4\u00e4nud postituse koodi l\u00e4bi.<\/p>\n<h2>Andmebaasip\u00e4ringud andmete kiireks v\u00e4rskendamiseks, 2. osa<\/h2>\n<p>Arvestades seda, kus me pooleli j\u00e4ime, on meil \u00fcks funktsioon, mis teeb j\u00e4rgmisi toiminguid.<\/p>\n<ol>\n<li>hankida k\u00f5ik konkreetse metav\u00f5tmega seotud postitused,<\/li>\n<li>otsustada, kas peame varakult lahkuma,<\/li>\n<li>v\u00e4rskendage k\u00f5igi olemasolevate postituste postituste olekut.<\/li>\n<\/ol>\n<p>K\u00f5igepealt tuleb m\u00e4rkida, et \u00fcks funktsioon on liiga palju, seega tuleb see jagada mitmeks muuks funktsiooniks. Ja kuna see on objektorienteeritud, peame tagama, et k\u00f5ik, mida funktsioon teeb, ei s\u00f5ltu tingimata eelmistest sammudest \u2013 see on protseduurilise programmeerimise eesm\u00e4rk.<\/p>\n<p>Selle asemel kasutame seda v\u00f5imalust funktsioonide seadistamiseks, et need toimiksid neile edastatavate andmete p\u00f5hjal, olenemata sellest, kuidas nad sinna j\u00f5udsid.<\/p>\n<p>L\u00f5puks on teie kui arendaja otsustada, kas soovite selle tegemiseks kasutada \u00fchte klassi, rohkem kui \u00fchte klassi v\u00f5i seotud klasside komplekti, mis p\u00e4rivad \u00fclemklassilt.<\/p>\n<p>J\u00e4llegi on k\u00f5ik selles, kui abstraktseks soovite koodi muuta.<\/p>\n<p>Praegu aga liigume asjade l\u00f5hkumisega edasi.<\/p>\n<h3>1 Haarake seotud metav\u00f5tmega postituste ID-d<\/h3>\n<p>T\u00e4pselt nagu esimeses postituses, tahame olla kindlad, et hangime postituste ID-sid, mis on seotud konkreetse metav\u00f5tmega.<\/p>\n<p>Selle funktsiooni v\u00f5imalikult paindlikuks muutmiseks seadistame selle j\u00e4rgmiselt:<\/p>\n<ul>\n<li>aktsepteeri metav\u00f5tit stringina,<\/li>\n<li>tagastab massiivi<\/li>\n<\/ul>\n<p>Funktsioon n\u00e4eb siis v\u00e4lja umbes <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-00-get-inactive-post-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">selline:<\/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>Esimeses postituses jagasime selle kolmeks etapiks (mis on ka \u00fclalpool v\u00e4lja toodud). Siin saame aga \u00fchendada teise ja kolmanda sammu \u00fcheks funktsiooniks.<\/p>\n<h3>2 V\u00e4rskendage postituse olekut<\/h3>\n<p>Nagu ma mainisin, on objektorienteeritud programmeerimise \u00fcks aspekt tagada, et meie kasutatavad funktsioonid oleksid vastuv\u00f5etavate andmete genereerimise suhtes agnostlikud.<\/p>\n<p>Selle asemel on neil \u00fcks algoritm, mis keskendub funktsioonile edastatud andmetele. Sel juhul tahame v\u00f5tta tulemuste komplekti (mis on postituse ID-d) ja v\u00e4rskendada nende postituse olekut nii, et see oleks <strong>mustand<\/strong>.<\/p>\n<p>See t\u00e4hendab, et funktsioon aktsepteerib massiivi, kuid ei tagasta midagi. V\u00f5imalik, et saate lasta sellel j\u00e4lgida paljusid v\u00e4rskendatud postitusi (v\u00f5i kui see \u00fcldse midagi v\u00e4rskendas), kuid ma keskendun lihtsalt juba olemasoleva koodi \u00fcmberkujundamisele.<\/p>\n<p>Nii et seda me teemegi. Ja esimene asi on veenduda, et on olemas tegelikud andmed, millega t\u00f6\u00f6tada. Kui jah, siis korrake postituste ID-de loendi massiivi ja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-01-set-posts-to-draft-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">muutke nende postituse olekut:<\/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>N\u00e4ete, et see ei erine palju esimeses postituses tehtud t\u00f6\u00f6st, kuid n\u00fc\u00fcd tekitab see paar k\u00fcsimust.<\/p>\n<h3>3 objektorienteeritud kaalutlused<\/h3>\n<p>Kui t\u00f6\u00f6tate sellise koodiga:<\/p>\n<ul>\n<li>Kas see k\u00f5ik kuulub samasse klassi v\u00f5i eraldi klassidesse?<\/li>\n<li>Kas baasklass peaks olema ja kui jah, siis miks v\u00f5i miks mitte?<\/li>\n<li>Kas peaks olema \u00fcks avalik funktsioon, mis kutsub neid meetodeid v\u00e4lja (ja laseb need privaatseks m\u00e4rkida)?<\/li>\n<li>Kas peaksime funktsioonid avalikuks j\u00e4tma?<\/li>\n<\/ul>\n<p>Selle postituse jaoks teen ma j\u00e4rgmist.<\/p>\n<ul>\n<li><strong>Esitage iga funktsioon avaliku meetodina<\/strong>. See on nii, et kui esimesest meetodist tagastatakse andmeid, saate nendega midagi muud teha.<\/li>\n<li><strong>Hoidke seda \u00fches klassis<\/strong>. Nii saame luua \u00fche klassi ja seej\u00e4rel kasutada seda mis tahes t\u00f6\u00f6 tegemiseks, mida vajame. Kui oleks muid meetodeid, kasutaksime samu meetodeid.<\/li>\n<li><strong>Alustage liidesega<\/strong>. Ma ei hakka vaevuma liidese kirjutamisega lihtsalt liidese n\u00e4itamise eesm\u00e4rgil (oletan, et seda on praeguste funktsioonide p\u00f5hjal piisavalt lihtne j\u00e4reldada), vaid v\u00f5tan klassi ette ja n\u00e4itan, kuidas me saame funktsioonid &quot;v\u00e4ljastpoolt sissepoole&quot;.<\/li>\n<\/ul>\n<p>Nii et ma alustan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-02-invoking-the-class-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">viimasest punktist<\/a> ja t\u00f6\u00f6tan tagasi. Siin on \u00fcks viis koodiga t\u00f6\u00f6tamiseks.<\/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>Ja siis n\u00e4eb <a href=\"https:\/\/gist.github.com\/tommcfarlin\/233a98350aa5ad4765e2a3c84691b0c1#file-03-post-status-modifier-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kogu klass v\u00e4lja j\u00e4rgmine:<\/a><\/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>\u00dcldiselt teenib see samu eesm\u00e4rke kui esimene, kuid rohkem objektorienteeritud viisil.<\/p>\n<h2>See ei ole Tee<\/h2>\n<p>Nagu ma olen p\u00fc\u00fcdnud selle postituse kaudu mitu korda korrata, ei ole see l\u00f5plik viis selle t\u00f6\u00f6 tegemiseks. Selle asemel on see \u00fcks viis, kuidas t\u00f6\u00f6d saab teha.<\/p>\n<p>Saate seda oma \u00e4ran\u00e4gemise j\u00e4rgi \u00fcmber kujundada, \u00fcmber teha v\u00f5i uuesti kasutada. Eesm\u00e4rk on aga n\u00e4idata, kuidas lahutada loogika, mida me tavaliselt n\u00e4eme protseduurilisena, millekski, mis on endast veidi v\u00e4hem s\u00f5ltuv ja j\u00e4tab ruumi t\u00e4iendavaks t\u00f6\u00f6ks.<\/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>Objektorienteeritud p\u00f5him\u00f5tete kasutamine klassi \u00fclesehituse t\u00e4iustamiseks andmebaasip\u00e4ringute kirjutamiseks andmete kiireks v\u00e4rskendamiseks.<\/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":[718,833,894,916,842],"tags":[1165],"class_list":["post-231159","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-juhend-algajatele","category-kood","category-muud","category-opetused","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=231159"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231159\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/237043"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=231159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=231159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=231159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}