{"id":231585,"date":"2022-12-24T19:08:00","date_gmt":"2022-12-24T16:08:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231585"},"modified":"2022-12-24T19:10:25","modified_gmt":"2022-12-24T16:10:25","slug":"yleinen-esimerkki-wordpressin-arkistokuviosta","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/yleinen-esimerkki-wordpressin-arkistokuviosta\/","title":{"rendered":"Yleinen esimerkki WordPressin arkistokuviosta"},"content":{"rendered":"\n<p>Kokemukseni mukaan tapa, jolla olemme ensimm\u00e4ist\u00e4 kertaa vuorovaikutuksessa arkiston suunnittelumallin kanssa, vaikuttaa usein siihen, miten ajattelemme kuviota. (Koko ensivaikutelma on pysyvi\u00e4 vaikutelmia, eik\u00f6 niin?)<\/p>\n<p>T\u00e4m\u00e4n postauksen tarkoituksena on n\u00e4ytt\u00e4\u00e4, kuinka se voidaan toteuttaa WordPressiss\u00e4 erityisesti kirjoitettaessa olio-laajennuksia tietojen lukemiseen (tietojen kirjoittamista voidaan k\u00e4sitell\u00e4 toisessa postauksessa), mutta ennen sen tekemist\u00e4 yritin mietti\u00e4 muutamia johdonmukaisuuksia n\u00e4kem\u00e4ni mallin muunnelmia.<\/p>\n<p>Yleisesti ottaen arkistomallin pit\u00e4isi mielest\u00e4ni tehd\u00e4 n\u00e4in:<\/p>\n<ul>\n<li>tarjota yksi paikka tietojen lukemiseen,<\/li>\n<li>tiivist\u00e4\u00e4 tiedot siit\u00e4, kuinka tietoja k\u00e4ytet\u00e4\u00e4n,<\/li>\n<li>ja niill\u00e4 on yhten\u00e4inen k\u00e4ytt\u00f6liittym\u00e4 t\u00e4t\u00e4 varten.<\/li>\n<\/ul>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 kaikki, mit\u00e4 sinun t\u00e4ytyy hakea sovelluksesta, voidaan hakea tietokannasta. Mutta kuinka se haettiin, voidaan pit\u00e4\u00e4 mustana laatikona. Se on mallin toteuttavan kehitt\u00e4j\u00e4n teht\u00e4v\u00e4.<\/p>\n<p>Ja niille, jotka lukevat t\u00e4m\u00e4n viestin, se on todenn\u00e4k\u00f6isesti me.<\/p>\n<h2>Arkistomalli WordPressiss\u00e4<\/h2>\n<p>Pari vuotta sitten <a href=\"https:\/\/wordpress.mediadoma.com\/fi\/arkiston-kuviopohja\/\" title=\"kirjoitin arkiston mallista\">kirjoitin arkiston mallista<\/a> antamalla konkreettisen esimerkin. Se on edelleen ajankohtainen, mutta tarkoitus, jonka haluan k\u00e4sitell\u00e4 t\u00e4ss\u00e4 viestiss\u00e4, on hieman erilainen.<\/p>\n<p>Sen sijaan, ett\u00e4 esitt\u00e4isin tietyn toteutuksen, joka on juurtunut todelliseen esimerkkiin, haluan mieluummin ottaa kantaa siihen, kuinka voimme k\u00e4ytt\u00e4\u00e4 t\u00e4t\u00e4 mallia p\u00e4ivitt\u00e4isess\u00e4 ty\u00f6ss\u00e4mme.<\/p>\n<p>Kaksi asiaa, jotka tulee pit\u00e4\u00e4 mieless\u00e4 t\u00e4t\u00e4 lukiessa:<\/p>\n<ol>\n<li>k\u00e4ytt\u00e4j\u00e4n n\u00e4k\u00f6kulmasta taustalla olevalla tietovarastolla ei ole v\u00e4li\u00e4,<\/li>\n<li>Kehitt\u00e4j\u00e4n n\u00e4k\u00f6kulmasta malli antaa meille mahdollisuuden ty\u00f6skennell\u00e4 useiden tietol\u00e4hteiden kanssa ja my\u00f6s mallintaa n\u00e4ytetietovaraston, jotta voimme yksikk\u00f6testata tietoja.<\/li>\n<\/ol>\n<p>Mallia toteutettaessa sill\u00e4, mist\u00e4 tiedot tulevat, ei ole v\u00e4li\u00e4. Ainakin niin kauan kuin olet kehitt\u00e4j\u00e4 tai asiakasobjekti, joka kutsuu siihen. Tietovarasto voi olla tietokanta, joukko API-toimintoja tai molempien yhdistelm\u00e4.<\/p>\n<p>Oletetaan siis, ett\u00e4 ty\u00f6skentelet tapahtumien mukautetun postaustyypin kanssa ja k\u00e4yt\u00e4t my\u00f6s viestien metatietoja ja vaihtoehtoja, jotka liittyv\u00e4t esimerkiksi tapahtumiin.<\/p>\n<p>Voit tehd\u00e4 jotain kuten:<\/p>\n<ul>\n<li>saada tapahtuman nimi,<\/li>\n<li>l\u00f6yt\u00e4\u00e4 tietoa tapahtuman paikasta,<\/li>\n<li>noutaa ensimm\u00e4isen viestityypin ja tilan sen tunnuksen mukaan<\/li>\n<\/ul>\n<p>Kaikki n\u00e4m\u00e4 tiedot voivat olla hajallaan eri paikoissa ja tapa, jolla se haetaan, voi vaihdella.<\/p>\n<h3>1 Tapahtuman nimen saaminen<\/h3>\n<p>Jos ty\u00f6skentelemme mukautetun viestityypin kanssa ja meid\u00e4n on saatava tapahtuman nimi, voimme k\u00e4ytt\u00e4\u00e4 viestin tunnusta ja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-00-get-event-name-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">yht\u00e4 WordPressin API-toiminnoista tehd\u00e4ksesi sen<\/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>T\u00e4m\u00e4 on yksi tapaus, jossa tietovarasto on edelleen erotettu meist\u00e4 ja sen sijaan hy\u00f6dynnet\u00e4\u00e4n olemassa olevaa WordPress-sovellusliittym\u00e4\u00e4.<\/p>\n<h3>2 Tapahtuman paikan saaminen<\/h3>\n<p>T\u00e4ss\u00e4 tapauksessa voimme olettaa, ett\u00e4 tapahtuman sijainti on sy\u00f6tetty manuaalisesti tai kenties kolmannen osapuolen sovellusliittym\u00e4 on hakenut sen. Ja koska sijainti liittyy tiettyyn tapahtumaan, se voi olla postin metatietotaulukossa.<\/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=\"Yleinen esimerkki WordPressin arkistokuviosta\"><\/a><\/p>\n<p>J\u00e4lleen voimme noutaa sen k\u00e4ytt\u00e4m\u00e4ll\u00e4 olemassa olevia API-toimintoja; kuitenkin t\u00e4llaisissa tilanteissa on j\u00e4rkev\u00e4\u00e4 k\u00e4ytt\u00e4\u00e4 aputoimintoa, koska tulemme todenn\u00e4k\u00f6isesti k\u00e4ytt\u00e4m\u00e4\u00e4n my\u00f6s muita metatietoja.<\/p>\n<p>Joten ensin <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\">apulainen<\/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 sitten toiminto, joka k\u00e4ytt\u00e4\u00e4 auttajaa <a href=\"https:\/\/gist.github.com\/tommcfarlin\/24e5bae859863d39512abc2af2169fbb#file-02-get-the-event-location-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sijainnin<\/a> hakemiseen :<\/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>Mutta n\u00e4iss\u00e4 kahdessa esimerkiss\u00e4 k\u00e4yt\u00e4mme edelleen olemassa olevia API-toimintoja. Ent\u00e4 tapaus, jossa meid\u00e4n on keskusteltava tietokannan kanssa?<\/p>\n<h3>3 Yhden viestin URL-osoitteen hakeminen<\/h3>\n<p>T\u00e4ss\u00e4 tapauksessa kommunikoimme suoraan WordPress-tietokannan kanssa. Jos tunnet <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">$wpdb-<\/a> objektin ja SQL:n, t\u00e4m\u00e4 ei ole iso juttu.<\/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=\"Yleinen esimerkki WordPressin arkistokuviosta\"><\/a><\/p>\n<p>Jos et ole, suosittelen lukemaan <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">valmistelu-<\/a> ja <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<\/a> &#8211; funktiosta.<\/p>\n<p>T\u00e4m\u00e4n perusteella voimme kirjoittaa kyselyn, joka tekee seuraavan:<\/p>\n<ol>\n<li>nappaa kaikki viestit, joissa tunnus vastaa tietty\u00e4 arvoa, postauksen tyyppi ja postauksen tila ovat tietty arvo, ja j\u00e4rjest\u00e4mme tulokset tunnuksen nousevan arvon mukaan,<\/li>\n<li>Seuraavaksi k\u00e4yt\u00e4mme kyseisen kyselyn tuloksia saadaksemme yhden arvon.<\/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\">voimme tehd\u00e4 t\u00e4m\u00e4n<\/a> sek\u00e4 k\u00e4ytt\u00e4m\u00e4ll\u00e4 tietokantaa ett\u00e4 kirjoittamalla sis\u00e4kk\u00e4isen kyselyn:<\/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 sitten kaikki t\u00e4m\u00e4 voidaan kapseloida yhteen luokkaan, joka olisi esimerkiksi Tapahtumavarasto (tai <strong>EventRepository<\/strong> ).<\/p>\n<p>Kerron t\u00e4st\u00e4 kuitenkin lis\u00e4\u00e4 seuraavassa postauksessa. Nimitt\u00e4in miten m\u00e4\u00e4ritell\u00e4\u00e4n, mitk\u00e4 funktiot kuuluvat minne, nime\u00e4misk\u00e4yt\u00e4nn\u00f6t ja kuinka k\u00e4sitell\u00e4 pysyvyytt\u00e4, jos haluat sis\u00e4llytt\u00e4\u00e4 sen my\u00f6s arkistoon.<\/p>\n<h2>Arkisto m\u00e4\u00e4ritetty<\/h2>\n<p>Ennen kaikkea muista t\u00e4m\u00e4:<\/p>\n<p>Arkistomalli peitt\u00e4\u00e4 tietojen haun, mutta tarjoaa johdonmukaisen tavan siihen, miten siihen liittyv\u00e4t tiedot voidaan noutaa.<\/p>\n<p>Jotkut saattavat my\u00f6s lis\u00e4t\u00e4, kuinka se voidaan hakea <strong>ja<\/strong> miten se voidaan kirjoittaa, mutta ehk\u00e4 keskustelen siit\u00e4 toisessa viestiss\u00e4.<\/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>Tietovarastomalli tarjoaa johdonmukaisen tavan tietojen hakemiseen. N\u00e4in se voidaan toteuttaa WordPress-laajennuksessa.<\/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":[719,895,864],"tags":[1166],"class_list":["post-231585","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231585","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=231585"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231585\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236255"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}