{"id":233949,"date":"2023-02-25T10:59:00","date_gmt":"2023-02-25T07:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233949"},"modified":"2022-11-11T13:21:32","modified_gmt":"2022-11-11T10:21:32","slug":"wordpress-teeman-opetusohjelma-aloittelijoille-osa-12-mukautettu-viestikysely","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/wordpress-teeman-opetusohjelma-aloittelijoille-osa-12-mukautettu-viestikysely\/","title":{"rendered":"WordPress-teeman opetusohjelma aloittelijoille \u2013 Osa 12: Mukautettu viestikysely"},"content":{"rendered":"\n<p>T\u00e4ll\u00e4 viimeisell\u00e4 oppitunnilla opimme kirjoittamaan oman kyselysi viesteist\u00e4 ja kiert\u00e4m\u00e4\u00e4n niit\u00e4 keskeytt\u00e4m\u00e4tt\u00e4 mallin yl\u00e4silmukkaa. Teemme yksitt\u00e4isille viesteille malliosan, jossa n\u00e4kyv\u00e4t samaan kategoriaan liittyv\u00e4t viestit.<\/p>\n<p>T\u00e4ll\u00e4 oppitunnilla teemme aiheeseen liittyv\u00e4n viestikyselyn yksitt\u00e4isess\u00e4 viestin\u00e4kym\u00e4ss\u00e4mme, joka n\u00e4ytt\u00e4\u00e4 enint\u00e4\u00e4n 3 viesti\u00e4, viestityyppist\u00e4 viesti\u00e4, samassa kategoriassa tai samassa kategoriassa kuin viesti, jossa olemme. Sulje pois itse nykyinen viesti, ja satunnaisesti n\u00e4ytetyt viestit. Tutkimme my\u00f6s strategioita, joilla sis\u00e4kk\u00e4ist\u00e4 silmukkaa ei sotketa.<\/p>\n<h2>Aiheeseen liittyvien viestien malli<\/h2>\n<p>Tehd\u00e4\u00e4n aiheeseen liittyvist\u00e4 viesteist\u00e4 malliosa, josta opimme <a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-10-fleshing-out-templates\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">osassa 10<\/a>. N\u00e4in emme monimutkaise liikaa <code>single.php<\/code>ja tee koodistamme uudelleenk\u00e4ytett\u00e4vyytt\u00e4. Aseta t\u00e4m\u00e4n uuden malliosan pyynt\u00f6 minne haluat. Laitan sen juuri ennen kommenttimallin pyyt\u00e4mist\u00e4:<\/p>\n<pre><code>...\n    &lt;\/article&gt;\n    &lt;?php \n    get_template_part('related-posts');\n    if (comments_open()) {\n        comments_template();\n    }\n    endwhile;\n...<\/code><\/pre>\n<p>Tehd\u00e4\u00e4n nyt uusi tyhj\u00e4 tiedosto teemakansioomme ja nimet\u00e4\u00e4n se <code>related-posts.php<\/code>. T\u00e4m\u00e4n tiedoston avulla olemme valmiita sukeltamaan mukautetun viestikyselyn luomiseen.<\/p>\n<h2>Mukautettu viestikysely<\/h2>\n<p>Jos haluat tehd\u00e4 mukautetun kyselyn viesteist\u00e4, sinulla on joitain vaihtoehtoja, mutta suosittelen tottumaan luokkaan <code>WP_Query<\/code>. Merkitse <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">t\u00e4m\u00e4 dokumentaatiosivu<\/a> kirjanmerkkeihin, koska tulet k\u00e4ytt\u00e4m\u00e4\u00e4n sit\u00e4 usein, koska vaihtoehtoja on niin monia. N\u00e4yt\u00e4n sinulle k\u00e4yt\u00e4nn\u00f6n esimerkin kyselyn m\u00e4\u00e4ritt\u00e4misest\u00e4 viittaamalla kunkin lis\u00e4tt\u00e4v\u00e4n spesifikaation dokumentaatioon.<\/p>\n<p>Jos haluat oppia lis\u00e4\u00e4 viestien tekemisest\u00e4, minulla <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">on viesti<\/a>, joka k\u00e4sittelee perusteellisesti juuri sit\u00e4.<\/p>\n<p>Mukautetun viestikyselyn tekemiseksi kutsumme, v\u00e4lit\u00e4mme <code>new WP_Query()<\/code>sille joukon argumentteja ja tallennamme sen tuloksen muuttujaan. Ja sitten k\u00e4yt\u00e4mme t\u00e4sm\u00e4lleen samaa silmukkaa kuin olemme k\u00e4ytt\u00e4neet aiemmin malleissamme (<a href=\"http:\/\/awhitepixel.com\/blog\/wordpress-theme-tutorial-for-beginners-part-4-accessing-posts-with-the-loop\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kurkista alkuper\u00e4ist\u00e4 silmukkaa t\u00e4st\u00e4<\/a> vertaillaksesi). Mutta meid\u00e4n on kerrottava silmukalle, ett\u00e4 se k\u00e4y l\u00e4pi muuttujan globaalin (joka on yksitt\u00e4inen viesti) sijaan.<\/p>\n<p>Silmukka n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4, kun se lis\u00e4t\u00e4\u00e4n mukautettuun kyselyyn:<\/p>\n<pre><code>$related_posts = new WP_Query([\n    \/\/ Arguments here\n]);\nif ($related_posts-&gt;have_posts()) {\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        \/\/ Access to each post here\n    endwhile;\n    wp_reset_postdata();\n}<\/code><\/pre>\n<p>Kuten n\u00e4et, silmukka on t\u00e4sm\u00e4lleen sama, k\u00e4ytt\u00e4m\u00e4ll\u00e4 <code>have_posts<\/code>ja <code>the_post<\/code>. Erona on, ett\u00e4 kutsumme niit\u00e4 <code>$related_posts<\/code>esineeseen. Jos ohitamme <code>$related_posts<\/code>osan, WordPress olettaa sen automaattisesti olevan viestien globaali kysely.<\/p>\n<p>Saatat my\u00f6s huomata funktiokutsun <code>wp_reset_postdata()<\/code>heti silmukan j\u00e4lkeen. N\u00e4in &quot;siivoamme j\u00e4lkemme&quot; mukautetun kyselyn j\u00e4lkeen <code>WP_Query<\/code>. Muista, ett\u00e4 se <code>the_post()<\/code>asettaa globaalin post-objektin, jotta voimme k\u00e4ytt\u00e4\u00e4 <code>the_title()<\/code>jne. Ja koska olemme jo silmukan sis\u00e4ll\u00e4 (jossa on <code>single.php<\/code>), meid\u00e4n on varmistettava, ett\u00e4 puhdistamme ja nollaamme viestin takaisin yksitt\u00e4iseksi viestiksi, kun olemme valmiita. Jos emme nollaa j\u00e4lkitietoja, kaikki t\u00e4m\u00e4n j\u00e4lkeen viittaavat viimeisimp\u00e4\u00e4n aiheeseen liittyv\u00e4\u00e4n viestiin, jonka k\u00e4vimme l\u00e4pi. T\u00e4m\u00e4 voi olla suuri ongelma! Esimerkiss\u00e4mme on kommenttimalli, joka seuraa t\u00e4t\u00e4. Jos nollaus j\u00e4tet\u00e4\u00e4n pois, kommenttimalli n\u00e4ytt\u00e4\u00e4 kommentit silmukan viimeisest\u00e4 aiheeseen liittyv\u00e4st\u00e4 viestist\u00e4. Eik\u00e4 ainoatakaan viesti\u00e4, jota tarkastelemme!<\/p>\n<h3>Toteutamme mukautetun silmukamme<\/h3>\n<p>Selv\u00e4, aloitetaan mukautetun silmukan k\u00e4ytt\u00f6\u00f6notto <code>related-posts.php<\/code>. Lis\u00e4sin k\u00e4\u00e4reen ja otsikon, mutta tavalliseen tapaan voit muokata HTML:\u00e4\u00e4 haluamallasi tavalla:<\/p>\n<pre><code>&lt;div class=\"related-posts\"&gt;\n    &lt;h2&gt;&lt;?php _e('Related posts', 'wptutorial'); ?&gt;&lt;\/h2&gt;\n    &lt;?php\n    $related_posts = new WP_Query([\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n        while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n\u00a0\n        endwhile;\n        wp_reset_postdata();\n    }\n    ?&gt;\n&lt;\/div&gt;<\/code><\/pre>\n<p>Nyt n\u00e4emme uudelleenk\u00e4ytett\u00e4vyyden voiman mallin osissa. Oletetaan, ett\u00e4 t\u00e4m\u00e4n mukautetun silmukan sis\u00e4ll\u00e4 haluamme n\u00e4ytt\u00e4\u00e4 t\u00e4sm\u00e4lleen saman sis\u00e4ll\u00f6n kuin <code>content-loop.php<\/code>, jota k\u00e4yt\u00e4mme arkistomalleissamme. Meid\u00e4n tarvitsee vain pyyt\u00e4\u00e4 t\u00e4m\u00e4 malliosa mukautetussa silmukassamme, olemmeko valmiita k\u00e4sittelem\u00e4\u00e4n jokaisen viestin tulosteen!<\/p>\n<pre><code>...\n    while ($related_posts-&gt;have_posts()): $related_posts-&gt;the_post();\n        get_template_part('content-loop');\n    endwhile;\n...<\/code><\/pre>\n<p>Nyt j\u00e4ljell\u00e4 on vain argumenttien lis\u00e4\u00e4minen viestikyselyymme varmistaen, ett\u00e4 haemme haluamamme. K\u00e4yd\u00e4\u00e4n argumentit yksitellen l\u00e4pi.<\/p>\n<h2>Muokatun viestikyselymme argumenttien rakentaminen<\/h2>\n<p>Haluamme hakea enint\u00e4\u00e4n 3 viesti\u00e4. Dokumentaatiossa (osio &quot;Sivutusparametrit&quot;) argumentti t\u00e4lle on <code>posts_per_page<\/code>. Joten lis\u00e4\u00e4mme array-elementin:<\/p>\n<pre><code>'posts_per_page' =&gt; 3<\/code><\/pre>\n<p>Haluamme varmistaa, ett\u00e4 WordPress hakee viestit, ei sivuja tai jotain muuta. Kohdasta &quot;Viestityyppiparametrit&quot; l\u00f6yd\u00e4mme:<\/p>\n<pre><code>'post_type' =&gt; 'post'<\/code><\/pre>\n<p>Haluamme est\u00e4\u00e4 sen, ett\u00e4 yksitt\u00e4inen viesti, jossa olemme, ei n\u00e4y aiheeseen liittyvien viestien kyselyss\u00e4mme, koska siin\u00e4 ei ole mit\u00e4\u00e4n j\u00e4rke\u00e4, eik\u00f6 niin? Dokumentaatiossa kerrotaan &quot;Viesti- ja sivuparametrit&quot; -kohdassa, ett\u00e4 voimme lis\u00e4t\u00e4 viestitunnuksen taulukkoon <code>post__not_in<\/code>:<\/p>\n<pre><code>'post__not_in' =&gt; [get_the_ID()]<\/code><\/pre>\n<p>Haluamme my\u00f6s satunnaistaa viestit; koska oletuksena se hakee viimeisimm\u00e4t julkaistut viestit, ja siit\u00e4 voi nopeasti tulla melko toistuvaa, kun k\u00e4yt viestej\u00e4 l\u00e4pi. Onneksi WordPressill\u00e4 on t\u00e4h\u00e4n toiminto, miten se j\u00e4rjest\u00e4\u00e4 viestit; &quot;Tilaa ja j\u00e4rjestele parametrien mukaan&quot; l\u00f6yd\u00e4mme:<\/p>\n<pre><code>'orderby' =&gt; 'rand'<\/code><\/pre>\n<p>Lopuksi haluamme kysy\u00e4 viesteist\u00e4, jotka kuuluvat samoihin luokkiin kuin viesti, jossa olemme. T\u00e4t\u00e4 varten meid\u00e4n on ensin, ennen kyselyargumentteja, saatava luokat yhteen viestiin, jossa olemme. Kohdassa &quot;Luokkaparametrit&quot; n\u00e4emme, ett\u00e4 voimme tarjota joukon luokkatunnuksia <code>category__in<\/code>. Onneksi WordPressiss\u00e4 on toiminto luokkatunnusten hankkimiseksi viestille; <code>wp_get_post_categories()<\/code>jota voimme k\u00e4ytt\u00e4\u00e4 suoraan parametrin arvona. T\u00e4ydellinen!<\/p>\n<p>T\u00e4ss\u00e4 viimeinen kysely ja sen argumentit:<\/p>\n<pre><code>...\n&lt;?php\n    $post_cats = wp_get_post_categories(get_the_ID());\n    $related_posts = new WP_Query([\n        'post_type' =&gt; 'post',\n        'posts_per_page' =&gt; 3,\n        'category__in' =&gt; $post_cats,\n        'post__not_in' =&gt; [get_the_ID()],\n        'orderby' =&gt; 'rand'\n    ]);\n    if ($related_posts-&gt;have_posts()) {\n...<\/code><\/pre>\n<p>P\u00e4ivit\u00e4 ja sinun pit\u00e4isi n\u00e4hd\u00e4 3 viesti\u00e4 yhden n\u00e4kym\u00e4n alareunassa. P\u00e4ivit\u00e4 useita kertoja n\u00e4hd\u00e4ksesi, ett\u00e4 ne muuttuvat, koska k\u00e4skimme WordPressi\u00e4 satunnaistaa ne. Huomautus: Jos sinulla on v\u00e4hemm\u00e4n kuin 3 viesti\u00e4 samassa kategoriassa, saat alle 3 viesti\u00e4.<\/p>\n<p>Se siit\u00e4! Nyt tied\u00e4t kuinka kysy\u00e4 mit\u00e4 tahansa haluamiasi viestej\u00e4. WP_Query <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">-dokumentaatiosivu<\/a> on eritt\u00e4in hy\u00f6dyllinen kyselysi s\u00e4\u00e4t\u00e4misess\u00e4, koska siell\u00e4 on todella rajattomat mahdollisuudet. Kehotan sinua leikki\u00e4 parametrien kanssa ja ehk\u00e4 yritt\u00e4\u00e4 tehd\u00e4 erillisen malliosan k\u00e4ytett\u00e4v\u00e4ksi aiheeseen liittyville viesteille.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4ss\u00e4 WordPress-teeman oppitunnissa opit kirjoittamaan oman kyselysi viesteist\u00e4 ja selaamaan niit\u00e4 keskeytt\u00e4m\u00e4tt\u00e4 mallin yl\u00e4silmukkaa.<\/p>\n","protected":false},"author":1,"featured_media":223852,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[927,895,719,719,895,917,917,1110,834,843,834,927,843,864,864],"tags":[1166],"class_list":["post-233949","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aiheita","category-koodi","category-kehittaejae","category-muut","category-n-a","category-opas-aloittelijoille","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233949","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=233949"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233949\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}