{"id":231029,"date":"2022-12-24T19:08:00","date_gmt":"2022-12-24T16:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231029"},"modified":"2022-12-24T19:10:18","modified_gmt":"2022-12-24T16:10:18","slug":"wordpressi-hoidla-mustri-ueldine-naeide","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/wordpressi-hoidla-mustri-ueldine-naeide\/","title":{"rendered":"WordPressi hoidla mustri \u00fcldine n\u00e4ide"},"content":{"rendered":"\n<p>Minu kogemuse kohaselt m\u00f5jutab see, kuidas me esimest korda hoidla kujundusmustriga suhtleme, sageli seda, kuidas me mustrist m\u00f5tleme. (Kogu esmamuljed on p\u00fcsivad, eks?)<\/p>\n<p>Selle postituse eesm\u00e4rk on n\u00e4idata, kuidas seda saab WordPressis rakendada just siis, kui kirjutate andmete lugemiseks objektorienteeritud pistikprogramme (andmete kirjutamist v\u00f5ib k\u00e4sitleda m\u00f5nes teises postituses), kuid enne seda proovisin v\u00e4lja m\u00f5elda m\u00f5ned j\u00e4rjepidevused mustri variatsioonid, mida olen n\u00e4inud.<\/p>\n<p>\u00dcldiselt arvan, et hoidla muster peaks seda tegema:<\/p>\n<ul>\n<li>pakkuda \u00fchte kohta andmete lugemiseks,<\/li>\n<li>tehke kokkuv\u00f5te \u00fcksikasjadest, kuidas andmetele juurde p\u00e4\u00e4seb,<\/li>\n<li>ja neil on selleks \u00fchtne liides.<\/li>\n<\/ul>\n<p>See t\u00e4hendab, et k\u00f5ik, mida peate rakendusest alla laadima, saab hankida andmebaasist. Kuid seda, kuidas see v\u00e4lja otsiti, v\u00f5ib pidada mustaks kastiks. See on mustri rakendava arendaja \u00fclesanne.<\/p>\n<p>Ja nende jaoks, kes seda postitust loevad, oleme t\u00f5en\u00e4oliselt meie.<\/p>\n<h2>WordPressi hoidla muster<\/h2>\n<p>Paar aastat tagasi <a href=\"https:\/\/wordpress.mediadoma.com\/et\/hoidla-mustri-praimer\/\" title=\"kirjutasin hoidla mustrist\">kirjutasin hoidla mustrist<\/a>, tuues konkreetse n\u00e4ite. See on endiselt asjakohane, kuid selle postituse eesm\u00e4rk on pisut erinev.<\/p>\n<p>Selle asemel, et n\u00e4idata konkreetset teostust, mis p\u00f5hineb tegelikul n\u00e4itel, tahaksin pigem selgitada, kuidas saaksime seda mustrit oma igap\u00e4evases t\u00f6\u00f6s kasutada.<\/p>\n<p>Seda lugedes tuleb meeles pidada kahte asja:<\/p>\n<ol>\n<li>kasutaja seisukohast pole aluseks olev andmesalv oluline,<\/li>\n<li>arendaja vaatevinklist v\u00f5imaldab muster meil t\u00f6\u00f6tada mitme andmeallikaga ja teha ka n\u00e4idisandmesalve, et saaksime andmeid katsetada.<\/li>\n<\/ol>\n<p>Mustri rakendamisel pole andmete p\u00e4ritolul t\u00e4htsust. V\u00e4hemalt seni, kuni olete arendaja v\u00f5i kliendiobjekt, kes sellesse helistab. Andmesalv v\u00f5ib olla andmebaas, API funktsioonide komplekt v\u00f5i m\u00f5lema kombinatsioon.<\/p>\n<p>Oletame siis, et t\u00f6\u00f6tate s\u00fcndmuste jaoks kohandatud postitust\u00fc\u00fcbiga ning t\u00f6\u00f6tate ka postituste metaandmete ja s\u00fcndmustega seotud valikutega.<\/p>\n<p>V\u00f5ite teha midagi sellist:<\/p>\n<ul>\n<li>hankige s\u00fcndmuse nimi,<\/li>\n<li>leida infot \u00fcrituse asukoha kohta,<\/li>\n<li>hankida esimene postituse t\u00fc\u00fcp ja olek, mis on j\u00e4rjestatud selle ID j\u00e4rgi<\/li>\n<\/ul>\n<p>Kogu see teave v\u00f5ib olla erinevatesse kohtadesse laiali ja selle hankimise viis v\u00f5ib olla erinev.<\/p>\n<h3>1 S\u00fcndmuse nime hankimine<\/h3>\n<p>Kui t\u00f6\u00f6tame kohandatud postituse t\u00fc\u00fcbiga ja peame saama s\u00fcndmuse nime, saame selleks kasutada postituse ID-d ja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-00-get-event-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00fcht WordPressi API funktsiooni<\/a>.<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Retrieves the title of the Event, a custom post type.\n *\n * @param  int    $eventId the ID of the event post type\n * @return string          the title of the post.\n *\/\npublic function getName(int $eventId): string\n{\n  return get_the_title($eventId);\n}<\/code><\/pre>\n<p>See on \u00fcks juhtum, kus andmesalv on ikka veel meist eemal ja selle asemel kasutab olemasolevat WordPressi API-d.<\/p>\n<h3>2 S\u00fcndmuse asukoha hankimine<\/h3>\n<p>Sel juhul v\u00f5ime eeldada, et s\u00fcndmuse asukoht on k\u00e4sitsi sisestatud v\u00f5i v\u00f5ib-olla on selle alla laaditud kolmanda osapoole API. Ja kuna asukoht on seotud konkreetse s\u00fcndmusega, v\u00f5ib see olla postituse metaandmete tabelis.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160195-61e7073d3924f.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-160195-61e7073d3924f.png\" alt=\"WordPressi hoidla mustri \u00fcldine n\u00e4ide\"><\/a><\/p>\n<p>J\u00e4llegi saame selle hankida juba olemasolevate API funktsioonide abil; aga sellistes olukordades on m\u00f5ttekas kasutada abifunktsiooni, sest t\u00f5en\u00e4oliselt p\u00e4\u00e4seme juurde ka teistele metaandmetele.<\/p>\n<p>Nii et k\u00f5igepealt <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-01-get-the-event-location-helper-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">abimees<\/a> :<\/p>\n<pre><code>&lt;?php \n\/**\n * A helper function for easily retrieving post meta data for a given Event.\n *\n * @param int    $id  the ID of the event\n * @param string $key the key for the post meta data for which we're retrieveing the data\n *\n * @return string the result of retrieiving the meta data\n *\/\nprivate function get(int $id, string $key): string\n{\n    return get_post_meta($id, $key, true);\n}<\/code><\/pre>\n<p>Ja siis funktsioon, mis kasutab <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-02-get-the-event-location-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">asukoha<\/a> leidmiseks abistajat :<\/p>\n<pre><code>&lt;?php\n\/**\n * @param  int    $eventID the ID of the event\n * @return string          the name of the event of an empty string\n *\/\npublic function getLocationName($eventId): string\n{\n    return $this-&gt;get($eventId, 'ymc-event-location-name');\n}<\/code><\/pre>\n<p>Kuid nendes kahes n\u00e4ites kasutame endiselt olemasolevaid API funktsioone. Kuidas on lood siis, kui peame andmebaasiga r\u00e4\u00e4kima?<\/p>\n<h3>3 \u00dche postituse URL-i toomine<\/h3>\n<p>Sel juhul suhtleme otse WordPressi andmebaasiga. Kui olete <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$ wpdb<\/a> objekti ja SQL-iga tuttav, pole see suur asi.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-160195-61e70741367bc.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-160195-61e70741367bc.png\" alt=\"WordPressi hoidla mustri \u00fcldine n\u00e4ide\"><\/a><\/p>\n<p>Kui te seda ei tee, soovitan lugeda nii <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ettevalmistamisfunktsiooni<\/a> kui ka funktsiooni <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Talking_to_the_Database:_The_wpdb_Class\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_results kohta<\/a>.<\/p>\n<p>Seda arvestades saame kirjutada p\u00e4ringu, mis teeb j\u00e4rgmist:<\/p>\n<ol>\n<li>haarake k\u00f5ik postitused, mille ID vastab kindlale v\u00e4\u00e4rtusele, postituse t\u00fc\u00fcp ja postituse olek on kindlad v\u00e4\u00e4rtused, ning j\u00e4rjestame tulemused ID kasvavas v\u00e4\u00e4rtuses,<\/li>\n<li>j\u00e4rgmiseks kasutame selle p\u00e4ringu tulemusi \u00fche v\u00e4\u00e4rtuse saamiseks.<\/li>\n<\/ol>\n<p>Ja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-03-get-single-post-url-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seda saame teha<\/a> nii andmebaasi juurde p\u00e4\u00e4sedes kui ka pesastatud p\u00e4ringu kirjutades:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * @return string the URL to the event next to the current event.\n *\/\npublic function getNextEventUrl()\n{\n    global $wpdb;\n    $results = $wpdb-&gt;get_results(\n        $wpdb-&gt;prepare(\n            \"\n            SELECT *\n            FROM $wpdb-&gt;posts\n            WHERE ID &gt; (SELECT ID\n                FROM $wpdb-&gt;posts\n                WHERE ID = %d\n                AND post_type = '%s'\n                AND post_status = '%s'\n                ORDER BY ID ASC) AND post_type = '%s'\n            AND post_status = '%s'\n            ORDER BY ID ASC\n            LIMIT 1\n        \",\n            get_the_ID(),\n            'ymc-events',\n            'publish',\n            'ymc-events',\n            'publish') );\n\n  $result = (isset($result[0]))? $result[0]: '';\n\n  return $result;\n}<\/code><\/pre>\n<p>Ja siis saab selle k\u00f5ik kapseldada \u00fchte klassi, mis oleks n\u00e4iteks s\u00fcndmuste hoidla (v\u00f5i <strong>EventRepository<\/strong> ).<\/p>\n<p>Sellest aga r\u00e4\u00e4gin pikemalt \u00fches j\u00e4rgnevas postituses. Nimelt, kuidas k\u00e4sitleda funktsioonide, kuhu kuuluvad, m\u00e4\u00e4ramist, nimetamiskokkuleppeid ja p\u00fcsivust, kui soovite seda ka oma hoidlasse tutvustada.<\/p>\n<h2>Hoidla on m\u00e4\u00e4ratletud<\/h2>\n<p>Eelk\u00f5ige pidage meeles j\u00e4rgmist:<\/p>\n<p>Hoidla muster varjab andmete toomise viisi, kuid annab j\u00e4rjepideva viisi sellega seotud andmete hankimiseks.<\/p>\n<p>M\u00f5ni v\u00f5ib ka lisada, kuidas seda saab k\u00e4tte saada <strong>ja<\/strong> kuidas seda kirjutada, aga v\u00f5ib-olla r\u00e4\u00e4gin sellest m\u00f5nes teises postituses.<\/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>Hoidla muster annab \u00fchtse viisi andmete toomiseks. Siit saate teada, kuidas seda WordPressi pistikprogrammis rakendada.<\/p>\n","protected":false},"author":1,"featured_media":236255,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,863],"tags":[1165],"class_list":["post-231029","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-wordpress-4","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231029","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=231029"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/231029\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/236255"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=231029"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=231029"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=231029"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}