{"id":231219,"date":"2022-12-15T20:02:00","date_gmt":"2022-12-15T17:02:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231219"},"modified":"2022-12-07T11:39:11","modified_gmt":"2022-12-07T08:39:11","slug":"mukautetut-arkistomallit-lyhyt-opas","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/mukautetut-arkistomallit-lyhyt-opas\/","title":{"rendered":"Mukautetut arkistomallit: lyhyt opas"},"content":{"rendered":"\n<p>Aina kun ty\u00f6skentelet arkistopohjien kanssa WordPressiss\u00e4, viestit on yleens\u00e4 listattu p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n mukaan laskevassa j\u00e4rjestyksess\u00e4. Toisin sanoen viimeisimm\u00e4t viestit luetellaan yl\u00e4reunassa, ja sitten se siirtyy sielt\u00e4.<\/p>\n<p>Viime aikoina olen ty\u00f6skennellyt muutaman projektin parissa, jotka integroituvat kolmannen osapuolen sovellusliittymiin. N\u00e4iden sovellusliittymien palautusp\u00e4iv\u00e4t \u2013 joskus kaksi p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4\u00e4, aloitusp\u00e4iv\u00e4 ja lopetusp\u00e4iv\u00e4 \u2013 tietylle tapahtumalle, ja asiakkaat haluavat k\u00e4ytt\u00e4\u00e4 n\u00e4it\u00e4 tietoja julkaisujen luetteloimiseen julkaisun p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4n sijaan. Eli he haluavat mukautettuja arkistomalleja.<\/p>\n<p>T\u00e4m\u00e4n tekeminen ei ole liian vaikeaa, mutta ennen kuin teet niin, mielest\u00e4ni on t\u00e4rke\u00e4\u00e4 antaa taustatietoja siit\u00e4, miten projekti on rakennettu, jotta on hieman enemm\u00e4n kontekstia sille, miksi esimerkiksi mukautettu kysely tarvitaan ja miksi saatat tai saatat. ei tarvitse tarkastella <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts -tiedostoja<\/a>.<\/p>\n<p>Aloitan kuitenkin ensin TL;DR:st\u00e4. N\u00e4in saat idean ennen kuin luet koko jutun.<\/p>\n<h2>Mukautetut arkistomallit<\/h2>\n<p>Joten TL;DR koko asian takana on t\u00e4m\u00e4:<\/p>\n<ul>\n<li>kolmannen osapuolen API:n tarjoamat p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4tiedot s\u00e4ilytet\u00e4\u00e4n metatietotaulukossa,<\/li>\n<li>avain on aloitusp\u00e4iv\u00e4 ja arvo on todellinen p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4,<\/li>\n<li>J\u00e4rjest\u00e4n sis\u00e4ll\u00f6n laskevassa j\u00e4rjestyksess\u00e4 ja meta-arvon mukaan.<\/li>\n<\/ul>\n<p>Sivutus voi olla ongelmallinen, ja jos k\u00e4yt\u00e4t mukautettua viestityyppi\u00e4, tarvitset joitain lis\u00e4parametreja, mutta yleisidea on olemassa.<\/p>\n<p>Nyt koko kokoonpanoon.<\/p>\n<h3>Mukautetut viestityypit<\/h3>\n<p>Mit\u00e4 tulee liit\u00e4nt\u00e4\u00e4n kolmansien osapuolien sovellusliittymiin, olen suuri mukautettujen viestityyppien fani, koska minulla on tapana ajatella niit\u00e4 mallien ja n\u00e4kymien hybridin\u00e4.<\/p>\n<ul>\n<li>Mallikomponentti sis\u00e4lt\u00e4\u00e4 kaiken, mik\u00e4 liittyy tangentiaalisesti ja voidaan kirjoittaa tietokantaan. T\u00e4m\u00e4 tarkoittaa kaikkia taksonomiatietoja tai post metatietoja.<\/li>\n<li>N\u00e4kym\u00e4komponentti on yleens\u00e4 mit\u00e4 tahansa, joka menee malliin ja joka voi hy\u00f6dynt\u00e4\u00e4 olemassa olevia mallitunnisteita, on mit\u00e4 tahansa, joka on ehk\u00e4 luotava ja joka my\u00f6s lukee tietoja tietokannasta.<\/li>\n<\/ul>\n<p>T\u00e4ss\u00e4 viestiss\u00e4 aion k\u00e4ytt\u00e4\u00e4 <strong>acme-event<\/strong> mukautettuna viestityyppin\u00e4.<\/p>\n<h3>L\u00e4het\u00e4 metatiedot<\/h3>\n<p>Asetan p\u00e4iv\u00e4m\u00e4\u00e4r\u00e4t julkaisun metatietoihin pikemminkin kuin itse viestiin, koska jos jotain tapahtuu tulevaisuudessa ja tiedot asetetaan itse viestitietueeseen, WordPress k\u00e4sittelee sit\u00e4 <strong>ajoitettuna<\/strong> postauksena, jota ei julkaista. .<\/p>\n<\/p>\n<p>Sen sijaan julkaisen viestin mieluummin ja muutan sitten tapaa, jolla metatiedot n\u00e4ytet\u00e4\u00e4n mallissa.<\/p>\n<h3>Sivunumerointi<\/h3>\n<p>WordPress tekee hienovaraisen eron koodipohjassaan olevalla sivutuksella. Toisin sanoen kyselymuuttuja sivustoille, joilla ei ole staattista kotisivua, k\u00e4ytt\u00e4\u00e4 <strong>paged<\/strong> ja p\u00e4invastaisessa tapauksessa <strong>sivua<\/strong>.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-161511-61e724257d2b2.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-161511-61e724257d2b2.png\" alt=\"Mukautetut arkistomallit: lyhyt opas\" ><\/a><\/p>\n<p>T\u00e4ll\u00e4 on merkityst\u00e4, kun rakennat kyselyn argumentteja, joihin p\u00e4\u00e4sen hetken kuluttua.<\/p>\n<h3>Vain arkistosivut<\/h3>\n<p>Muista, ett\u00e4 aina kun otat k\u00e4ytt\u00f6\u00f6n sivutuksen, haluat muuttaa kysely\u00e4 vain, kun olet varsinaisella arkistosivulla.<\/p>\n<p>T\u00e4m\u00e4 tarkoittaa, ett\u00e4 et v\u00e4lit\u00e4 tapauksista, joissa olet WordPressin hallinnollisella alueella etk\u00e4 halua muuttaa ei-mukautetun post-tyyppisten arkistojen kysely\u00e4. T\u00e4t\u00e4 varten sinun kannattaa varmistaa, ett\u00e4 asetat kyselymuuttujan oikein pre_get_posts-vastakutsussa.<\/p>\n<p>Huomaa, ett\u00e4 voin n\u00e4ytt\u00e4\u00e4 toiminnon, kuinka t\u00e4m\u00e4 tehd\u00e4\u00e4n, mutta koska kirjoitamme koodia WordPressiss\u00e4 \u2013 toisin sanoen jotkut kirjoittavat prosessikoodia, toiset taas oliokoodia \u2013 n\u00e4yt\u00e4n sen yksinkertaisesti prosessikoodina.<\/p>\n<h3>Tuo kaikki yhteen<\/h3>\n<p>Ensin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-00-custom-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">teen kyselyn:<\/a><\/p>\n<pre><code>&lt;?php\n\n$eventQuery = new WP_Query([\n    'post_type' =&gt; 'acme-events',\n    'post_status' =&gt; 'publish',\n    'orderby' =&gt; 'meta_value',\n    'order' =&gt; 'desc',\n    'meta_key' =&gt; 'acme-event-start-date-time',\n    'posts_per_archive_page' =&gt; 5,\n    'paged' =&gt; get_query_var('paged')? get_query_var('paged'): 1\n]);<\/code><\/pre>\n<p>Huomaa, ett\u00e4 yll\u00e4 olevassa koodissa on argumentti <strong>sivulle<\/strong>. Puhun t\u00e4m\u00e4n koodista hetken kuluttua.<\/p>\n<p>Sitten malli sis\u00e4lt\u00e4\u00e4 kaikki tiedot, jotka haluat n\u00e4ytt\u00e4\u00e4. P\u00e4\u00e4t\u00e4n olla jakamatta mallini koodia t\u00e4ss\u00e4 viestiss\u00e4, koska sill\u00e4 ei ole merkityst\u00e4 k\u00e4sill\u00e4 olevan suuremman idean kannalta.<\/p>\n<p>Lis\u00e4ksi sinulla on kaikki mit\u00e4 tarvitset sis\u00e4ll\u00f6n n\u00e4ytt\u00e4miseen.<\/p>\n<p>Seuraavaksi asetan sivuttamisen. Ensin minun on teht\u00e4v\u00e4 t\u00e4m\u00e4 k\u00e4ytt\u00e4m\u00e4ll\u00e4 pre_get_posts-koukkua <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-01-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">varmistaakseni, ett\u00e4 oikea kyselymuuttuja on asetettu<\/a> :<\/p>\n<pre><code>&lt;?php\n\nadd_action('pre_get_posts', 'setCustomQueryVariable');\npublic function setCustomQueryVariable($query)\n{\n    if (is_admin() || !is_archive()) {\n        return;\n    }\n\n    if ($query-&gt;is_archive('acme-events')) {\n        set_query_var('posts_per_page', 5);\n    }\n}<\/code><\/pre>\n<p>Sitten <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-02-pagination-links-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">toteutan sivutuksen<\/a> mukautetulla kyselyll\u00e4:<\/p>\n<pre><code>&lt;?php\n\n&lt;a class=\"next page-numbers\" href=\"&lt;?php echo esc_attr(get_next_posts_page_link($eventQuery-&gt;max_num_pages)); ?&gt;\"&gt;\n    Next Page\n&lt;\/a&gt;\n\n&lt;a class=\"prev page-numbers\" href=\"&lt;?php echo esc_attr(get_previous_posts_page_link()); ?&gt;\"&gt;\n    Previous Page\n&lt;\/a&gt;<\/code><\/pre>\n<p>Ja sen j\u00e4lkeen nollaan <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-03-reset-post-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">globaalin $post-muuttujan<\/a> komennolla wp_reset_postdata() silt\u00e4 varalta, ett\u00e4 jotain alkuper\u00e4isest\u00e4 viestist\u00e4 on k\u00e4ytett\u00e4v\u00e4.<\/p>\n<pre><code>&lt;?php wp_reset_postdata(); ?&gt;<\/code><\/pre>\n<p>T\u00e4t\u00e4 pidet\u00e4\u00e4n yleens\u00e4 hyv\u00e4n\u00e4 siivouksena aina, kun k\u00e4yt\u00e4t mukautettua kysely\u00e4.<\/p>\n<h3>hy\u00f6dyllisi\u00e4 linkkej\u00e4<\/h3>\n<p>Alla on luettelo toiminnoista, sivuista ja viittauksista, jotka saattavat olla hy\u00f6dyllisi\u00e4, koska ne liittyv\u00e4t yll\u00e4 olevaan koodiin tai mihin tahansa tulevaan ty\u00f6h\u00f6n, jota saatat tehd\u00e4.<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Kysely<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Pagination\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Sivunumerointi<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/pre_get_posts\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pre_get_posts<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/set_query_var\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">set_query_var<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_posts_page_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_posts_page_link<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/update_post_meta\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">update_post_meta<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/wp_reset_postdata\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">wp_reset_postdata<\/a><\/li>\n<li>T\u00e4ysi <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koodi<\/a> t\u00e4ss\u00e4 viestiss\u00e4.<\/li>\n<\/ul>\n<p>Jos olet ty\u00f6skennellyt WordPressin kanssa pitk\u00e4\u00e4n, osa n\u00e4ist\u00e4 saattaa tuntua tarpeettomilta. Muissa tapauksissa se voi vaikuttaa uudelta tai se saattaa valaista WordPress-sovellusliittymien alueita, joiden olemassaolosta et tiennyt (ainakin minun kohdallani).<\/p>\n<h2>Miksi vaivautua t\u00e4m\u00e4n kaiken kanssa?<\/h2>\n<p>T\u00e4m\u00e4 saattaa tulla pitk\u00e4 viesti n\u00e4enn\u00e4isen yksinkertaista teht\u00e4v\u00e4\u00e4 varten, mutta tiedot ovat hieman hajallaan verkossa, koska ne liittyv\u00e4t t\u00e4llaiseen tekemiseen.<\/p>\n<p>Halusin siis yritt\u00e4\u00e4 yhdist\u00e4\u00e4 kaiken selityksien, esimerkkikoodien ja linkkien avulla sivuille, jotka saattavat olla kiinnostavia toteutustavan mukaan.<\/p>\n<p>Loppujen lopuksi monet meist\u00e4 k\u00e4ytt\u00e4v\u00e4t WordPressi\u00e4 perussis\u00e4ll\u00f6nhallinnan lis\u00e4ksi t\u00e4ll\u00e4 hetkell\u00e4, mutta se ei tarkoita, ett\u00e4 meid\u00e4n ei pit\u00e4isi hy\u00f6dynt\u00e4\u00e4 sen sis\u00e4\u00e4nrakennettuja toimintoja ja API-liittymi\u00e4 mahdollisuuksien mukaan.<\/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>Pid\u00e4 t\u00e4t\u00e4 pikakurssina mukautettujen arkistopohjien ja kaikkien niit\u00e4 ymp\u00e4r\u00f6ivien toimintojen luomiseen.<\/p>\n","protected":false},"author":1,"featured_media":236214,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,803,864],"tags":[1166],"class_list":["post-231219","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231219","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=231219"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231219\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236214"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}