{"id":230257,"date":"2022-12-06T15:41:00","date_gmt":"2022-12-06T12:41:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230257"},"modified":"2022-12-06T15:51:22","modified_gmt":"2022-12-06T12:51:22","slug":"loetavate-wordpressi-funktsioonide-kirjutamisest","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/loetavate-wordpressi-funktsioonide-kirjutamisest\/","title":{"rendered":"Loetavate WordPressi funktsioonide kirjutamisest"},"content":{"rendered":"\n<p>\u00dcks asi, mis mulle pidevalt huvi pakub (nii programmeerimise kui ka WordPressi seisukohast), on j\u00e4rgmine:<\/p>\n<p>Mulle meeldib koodi eraldamine nii, et WordPressiga suhtlemise eest vastutav kood nihutatakse selle nimeruumi, samas kui \u00fclej\u00e4\u00e4nud kood on mujal sobivalt nimeruumi paigutatud.<\/p>\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/et\/lihtne-juhend-wordpressi-kesksete-tundide-korraldamiseks\/\" title=\"Ma arvan, et see on siiski ilmne\">Ma arvan, et see on siiski ilmne<\/a><\/strong>.<\/p>\n<p>Mis aga puutub koodi kirjutamisse, siis see ei t\u00e4henda, et see peaks j\u00e4\u00e4ma lihtsalt klasside kirjutamise ja seej\u00e4rel korraldamise otsustada. Kuidas on lood asjadega veidi detailsemal tasemel?<\/p>\n<p>See t\u00e4hendab, mis siis, kui me vaataksime meetodeid suurema terviku osana ja veenduksime, et ka need teevad oma t\u00f6\u00f6d h\u00e4sti? Muidugi on sellised inimesed nagu <strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Robert_C._Martin\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Bob Martin<\/a><\/strong> kirjutanud sellistest asjadest suurema osa oma karj\u00e4\u00e4rist ja jutlustanud seda meiesugustele inimestele.<\/p>\n<p>Kuid need kontseptsioonid on midagi, mida te lihtsalt alustate ja seej\u00e4rel rakendate neid l\u00f5plikult. Paradigmad muutuvad, oleme t\u00e4na paremad kui eile ja sama eesm\u00e4rgi saavutamiseks v\u00f5ib olla mitu v\u00f5imalust.<\/p>\n<p>Kui r\u00e4\u00e4kida konkreetse domeeni jaoks loetavate WordPressi funktsioonide loomisest, siis milline see v\u00f5ib v\u00e4lja n\u00e4ha?<\/p>\n<h2>Loetavad WordPressi funktsioonid<\/h2>\n<p>Neile, kes tunnevad <a href=\"https:\/\/en.wikipedia.org\/wiki\/SOLID\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SOLIDi<\/a> p\u00f5him\u00f5tteid v\u00f5i k\u00f5ike, mis r\u00e4\u00e4gib hea koodi kirjutamisest, on \u00fcks asi, millest paljud neist inimestest kirjutavad, meetodi pikkus.<\/p>\n<p>Ma kipun v\u00f5tma neid pigem reeglite kui seadusena, sest m\u00f5nikord ei saa meetodid nii l\u00fchikesed olla. Ma arvan, et nad v\u00f5iksid, aga mingil hetkel tundub see koodi mikrohaldusena, eks?<\/p>\n<p>Ja teha midagi tegemise p\u00e4rast, on \u00fcks asi, aga teha midagi m\u00f5testatud programmeerimise p\u00e4rast on teine. Iga kord valin hilisema.<\/p>\n<p>Igatahes, siin on n\u00e4ide: Oletame, et teil on m\u00f5ni kood, mida kutsutakse Ajaxi kaudu ja enne toiminguga j\u00e4tkamist peate teadma, kas kohandatud postituse t\u00fc\u00fcp on olemas.<\/p>\n<p>Sellise tegevuse toimingud v\u00f5ivad olla j\u00e4rgmised:<\/p>\n<ul>\n<li>algatada Ajaxi k\u00f5ne,<\/li>\n<li>kontrollige turvalisust, et veenduda, et see taotlus on kehtiv,<\/li>\n<li>kontrollige, kas andmed on olemas,<\/li>\n<li>kui jah, saatke eduteade; kui ei, tagastage veateade.<\/li>\n<\/ul>\n<p>Seda k\u00f5ike saab kindlasti teha \u00fche s\u00f5numiga, kuid oletame, et tahame seda kirjutada h\u00f5lpsasti loetavate k\u00f5nede seeriana, kus kood on teatud m\u00e4\u00e4ral isedokumenteeruv (see ei t\u00e4henda, et ma Olen kommentaaride vastu \u2013 ma ei ole \u00fcldse, aga see ei t\u00e4henda, et me tahame, et meie kood oleks ebaselge, eks?).<\/p>\n<p>Esiteks <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-00-get-details-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ajaxi k\u00f5ne<\/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>Seej\u00e4rel <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-01-get-details-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">on meil<\/a><\/strong> serveri poolel funktsioon turvalisuse otseseks kontrollimiseks (see muidugi eeldab, et olete selle esiotsas \u00f5igesti seadistanud):<\/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>P\u00e4rast seda tahame <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-02-do-details-exists-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kontrollida, kas andmed on olemas:<\/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>Siit edasi saame seej\u00e4rel t\u00f6\u00f6tada Ajaxi vastuseobjektiga, hinnates selle edukust ja reageerides sellele vastavalt.<\/p>\n<h2>Minnes sammu edasi<\/h2>\n<p>Astume sellest siiski sammu edasi ja \u00fctleme, et tooted on olemas ja me tahame hankida k\u00f5ik nende postituste ID-d. Seda on WP_Query abil \u00fcsna lihtne teha, kuid oletame, et me tahame otse andmebaasiga liidestada.<\/p>\n<p>Pange t\u00e4hele, et see on pigem harjutus, mille eesm\u00e4rk on n\u00e4idata, kuidas midagi teha, selle asemel, et <strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vaielda $wpdb<\/a><\/strong> kasutamise \u00fcle <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query kaudu<\/a>. See on sisu hoopis teisele postitusele.<\/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=\"Loetavate WordPressi funktsioonide kirjutamisest\"><\/a><\/p>\n<p>Igatahes tegime kindlaks, et andmed on olemas. Haarame siis k\u00f5igi postituste ID-de massiivi ja tagastame selle v\u00f5i t\u00fchja massiivi. V\u00f5ib-olla n\u00e4eks see v\u00e4lja <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/2969c83cef4a946fa6c82b2f3bb1226d#file-03-get-detail-ids-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">umbes selline:<\/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>Kui v\u00e4\u00e4rtused on tagastatud, saame nendega t\u00f6\u00f6tada nii, nagu me \u00f5igeks peame.<\/p>\n<h2>Mis on selle k\u00f5ige eesm\u00e4rk?<\/h2>\n<p>\u00dcldiselt on see selleks, et aidata meil koodist m\u00f5elda nii, et suudaksime lugeda seda peaaegu kirjas\u00f5nale v\u00f5imalikult l\u00e4hedalt. See t\u00e4hendab, et saame osutada koodijupile j\u00e4rgmiselt:<\/p>\n<blockquote>\n<p>Esiteks vaatame, kas midagi on olemas. Kui ei, saadame veateate; vastasel juhul v\u00f5tame andmed kokku ja t\u00f6\u00f6tame siis nende kallal.<\/p>\n<\/blockquote>\n<p>T\u00f5si, ma r\u00e4\u00e4gin siin v\u00e4hem konkreetselt, kuid selle p\u00f5hjuseks on asjaolu, et ma ei tea tingimata, millega te t\u00f6\u00f6tate, rohkem kui minu t\u00f6\u00f6st. Aga saate ideest aru, eks?<\/p>\n<p>Ja lisaks, kui otsite WordPressist lahti \u00fchendatud testikoodi, saate seda teha liideste abil, mis pilkavad funktsioone v\u00f5i isegi k\u00e4ivitavad otsep\u00e4ringuid andmebaasist ilma WordPressi kasutamata.<\/p>\n<p>Kuid nagu m\u00f5nede \u00fclalmainitud punktide puhul, on see teise postituse teema.<\/p>\n<p>Kirjutan praegu e-raamatut (koos mitme muu esmaklassilise sisuga). Kui olete huvitatud, <a href=\"https:\/\/tommcfarlin.com\/registration-info\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vaadake, mida saate<\/a>.<\/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>Mida loetavate WordPressi funktsioonide kirjutamine tegelikult t\u00e4hendab? Pole olemas \u00fchte, t\u00e4iuslikku ja t\u00e4pset \u00f5iget vastust, kuid v\u00f5ib-olla aitab see l\u00e4henemisviis.<\/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":[863],"tags":[1165],"class_list":["post-230257","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230257","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=230257"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/230257\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/236179"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=230257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=230257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=230257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}