{"id":233874,"date":"2023-02-25T10:49:00","date_gmt":"2023-02-25T07:49:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233874"},"modified":"2022-11-11T12:55:21","modified_gmt":"2022-11-11T09:55:21","slug":"handledning-foer-wordpress-tema-foer-nyboerjare-del-12-anpassad-inlaeggsfraaga","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/handledning-foer-wordpress-tema-foer-nyboerjare-del-12-anpassad-inlaeggsfraaga\/","title":{"rendered":"Handledning f\u00f6r WordPress-tema f\u00f6r nyb\u00f6rjare \u2013 Del 12: Anpassad inl\u00e4ggsfr\u00e5ga"},"content":{"rendered":"\n<p>I den h\u00e4r sista lektionen l\u00e4r vi oss hur du skriver din egen fr\u00e5ga med inl\u00e4gg och g\u00e5r igenom dem utan att avbryta f\u00f6r\u00e4ldraslingan i mallen. Vi kommer att g\u00f6ra en malldel f\u00f6r enstaka inl\u00e4gg som visar relaterade inl\u00e4gg i samma kategori.<\/p>\n<p>Vad vi kommer att g\u00f6ra i den h\u00e4r lektionen \u00e4r en relaterad inl\u00e4ggsfr\u00e5ga i v\u00e5r enda inl\u00e4ggsvy, som visar maximalt 3 inl\u00e4gg, av inl\u00e4ggstyp inl\u00e4gg, i samma kategori eller kategorier som inl\u00e4gget vi \u00e4r p\u00e5, exkludera sj\u00e4lva det aktuella inl\u00e4gget, och randomisera inl\u00e4ggen som visas. Vi kommer ocks\u00e5 att unders\u00f6ka strategier f\u00f6r att inte f\u00f6rst\u00f6ra den kapslade slingan.<\/p>\n<h2>Mall f\u00f6r relaterade inl\u00e4gg<\/h2>\n<p>L\u00e5t oss g\u00f6ra de relaterade inl\u00e4ggen till en malldel, som vi l\u00e4rde oss om i <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\">del 10<\/a>. P\u00e5 s\u00e5 s\u00e4tt \u00f6verkomplicerar vi inte <code>single.php<\/code>och g\u00f6r v\u00e5r kod mer \u00e5teranv\u00e4ndbar. Placera beg\u00e4ran om denna nya malldel var du vill. Jag placerar den precis innan jag beg\u00e4r kommentarsmall:<\/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>L\u00e5t oss nu skapa en ny tom fil i v\u00e5r temamapp och namnge den <code>related-posts.php<\/code>. Med den h\u00e4r filen \u00e4r vi redo att dyka in i att skapa en anpassad inl\u00e4ggsfr\u00e5ga.<\/p>\n<h2>Anpassad inl\u00e4ggsfr\u00e5ga<\/h2>\n<p>Om du vill g\u00f6ra en anpassad fr\u00e5ga av inl\u00e4gg har du n\u00e5gra alternativ, men jag rekommenderar att du v\u00e4njer dig vid klassen <code>WP_Query<\/code>. Bokm\u00e4rk <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">den h\u00e4r dokumentationssidan<\/a> eftersom du kommer att referera till den ofta, eftersom det finns s\u00e5 m\u00e5nga alternativ. Jag kommer att visa dig ett praktiskt exempel p\u00e5 hur du st\u00e4ller in en fr\u00e5ga genom att h\u00e4nvisa till dokumentationen f\u00f6r varje specifikation vi vill l\u00e4gga till.<\/p>\n<p>Om du vill l\u00e4ra dig mer om hur man fr\u00e5gar efter inl\u00e4gg s\u00e5 har jag <a href=\"http:\/\/awhitepixel.com\/blog\/how-to-query-posts-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ett inl\u00e4gg<\/a> som g\u00e5r p\u00e5 djupet om just det.<\/p>\n<p>F\u00f6r att g\u00f6ra en anpassad inl\u00e4ggsfr\u00e5ga kommer vi att anropa <code>new WP_Query()<\/code>, skicka en rad argument till den och lagra resultatet i en variabel. Och d\u00e5 kommer vi att anv\u00e4nda exakt samma slinga som vi har anv\u00e4nt tidigare i v\u00e5ra mallar (ta en <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\">titt p\u00e5 originalslingan h\u00e4r<\/a> f\u00f6r att j\u00e4mf\u00f6ra). Men vi m\u00e5ste s\u00e4ga till slingan att g\u00e5 igenom variabeln, ist\u00e4llet f\u00f6r den globala (som \u00e4r det enda inl\u00e4gget).<\/p>\n<p>S\u00e5 h\u00e4r kommer slingan att se ut n\u00e4r du l\u00e4gger till den i en anpassad fr\u00e5ga:<\/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>Som du kan se \u00e4r slingan exakt densamma, med hj\u00e4lp av <code>have_posts<\/code>och <code>the_post<\/code>. Skillnaden \u00e4r att vi kallar dem p\u00e5 <code>$related_posts<\/code>objektet. Om vi \u200b\u200bhoppar \u00f6ver <code>$related_posts<\/code>delen antar WordPress automatiskt att det \u00e4r den globala fr\u00e5gan av inl\u00e4gg.<\/p>\n<p>Du kanske ocks\u00e5 m\u00e4rker funktionsanropet <code>wp_reset_postdata()<\/code>direkt efter loopen. S\u00e5 h\u00e4r &quot;st\u00e4dar vi efter oss&quot; efter en anpassad fr\u00e5ga med <code>WP_Query<\/code>. Kom ih\u00e5g att det <code>the_post()<\/code>st\u00e4ller in det globala postobjektet s\u00e5 att vi kan anv\u00e4nda <code>the_title()<\/code>etc. Och eftersom vi redan \u00e4r inne i en loop (den i <code>single.php<\/code>), m\u00e5ste vi se till att vi st\u00e4dar upp och \u00e5terst\u00e4ller inl\u00e4gget till det enda inl\u00e4gget n\u00e4r vi \u00e4r klara. Om vi \u200b\u200binte \u00e5terst\u00e4ller postdata kommer allt efter detta att h\u00e4nvisa till det senaste relaterade inl\u00e4gget vi gick igenom. Detta kan vara ett stort problem! I v\u00e5rt exempel har vi ha en kommentarsmall som f\u00f6ljer detta. Om du utel\u00e4mnar \u00e5terst\u00e4llningen kommer kommentarsmallen att visa kommentarer fr\u00e5n det senaste relaterade inl\u00e4gget i slingan. Och inte det enda inl\u00e4gget vi faktiskt tittar p\u00e5!<\/p>\n<h3>Implementering av v\u00e5r anpassade loop<\/h3>\n<p>Okej, l\u00e5t oss b\u00f6rja implementera den anpassade slingan i v\u00e5r <code>related-posts.php<\/code>. Jag lade till ett omslag och en titel, men som vanligt kan du justera HTML-koden som du vill:<\/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>Nu ska vi se kraften med \u00e5teranv\u00e4ndbarhet i malldelar. L\u00e5t oss s\u00e4ga att vi inuti denna anpassade loop vill visa exakt samma inneh\u00e5ll som vi g\u00f6r i v\u00e5r <code>content-loop.php<\/code>, som vi anv\u00e4nder i v\u00e5ra arkivmallar. Allt vi beh\u00f6ver g\u00f6ra \u00e4r att beg\u00e4ra den h\u00e4r malldelen i v\u00e5r anpassade loop, \u00e4r vi redo att hantera utdata fr\u00e5n varje inl\u00e4gg!<\/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>Nu \u00e5terst\u00e5r bara att l\u00e4gga till argumenten till v\u00e5r inl\u00e4ggsfr\u00e5ga och se till att vi h\u00e4mtar det vi vill ha. L\u00e5t oss g\u00e5 igenom argumenten en efter en.<\/p>\n<h2>Bygga argumenten till v\u00e5r anpassade inl\u00e4ggsfr\u00e5ga<\/h2>\n<p>Vi vill inte h\u00e4mta fler inl\u00e4gg \u00e4n 3. I dokumentationen (avsnittet &quot;Pagination parametrar&quot;) \u00e4r argumentet f\u00f6r detta <code>posts_per_page<\/code>. S\u00e5 vi l\u00e4gger till arrayelementet:<\/p>\n<pre><code>'posts_per_page' =&gt; 3<\/code><\/pre>\n<p>Vi vill se till att WordPress h\u00e4mtar inl\u00e4gg, och inte sidor eller n\u00e5got annat. I &quot;Post type parametrar&quot; hittar vi:<\/p>\n<pre><code>'post_type' =&gt; 'post'<\/code><\/pre>\n<p>Vi vill f\u00f6rhindra att det enda inl\u00e4gget vi \u00e4r p\u00e5, visas i v\u00e5r relaterade inl\u00e4ggsfr\u00e5ga, f\u00f6r det \u00e4r ingen mening, eller hur? Dokumentationen talar om f\u00f6r oss i &quot;Inl\u00e4ggs- och sidparametrar&quot; att vi kan l\u00e4gga till post-ID:t i en array f\u00f6r <code>post__not_in<\/code>:<\/p>\n<pre><code>'post__not_in' =&gt; [get_the_ID()]<\/code><\/pre>\n<p>Vi vill ocks\u00e5 randomisera inl\u00e4ggen; eftersom det som standard h\u00e4mtar de senaste publicerade inl\u00e4ggen och det kan snabbt bli ganska repetitivt n\u00e4r du g\u00e5r igenom inl\u00e4gg. Som tur \u00e4r har WordPress en funktion f\u00f6r detta i hur det ordnar inl\u00e4ggen; i &quot;Ordning och ordning efter parametrar&quot; hittar vi:<\/p>\n<pre><code>'orderby' =&gt; 'rand'<\/code><\/pre>\n<p>Slutligen vill vi fr\u00e5ga inl\u00e4gg som \u00e4r inom samma kategorier som inl\u00e4gget vi \u00e4r p\u00e5. F\u00f6r att g\u00f6ra detta m\u00e5ste vi f\u00f6rst, f\u00f6re fr\u00e5geargumenten, f\u00e5 kategorierna till det enda inl\u00e4gget vi befinner oss p\u00e5. I &quot;Kategoriparametrar&quot; ser vi att vi kan tillhandah\u00e5lla en rad kategori-ID:n till <code>category__in<\/code>. Som tur \u00e4r har WordPress en funktion f\u00f6r att f\u00e5 kategori-ID:n f\u00f6r ett inl\u00e4gg; <code>wp_get_post_categories()<\/code>som vi kan anv\u00e4nda rakt ut som v\u00e4rde p\u00e5 parametern. Perfekt!<\/p>\n<p>H\u00e4r \u00e4r den sista fr\u00e5gan och dess argument:<\/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>Uppdatera och du b\u00f6r se 3 inl\u00e4gg listade l\u00e4ngst ned i enstaka vy. Uppdatera flera g\u00e5nger f\u00f6r att se att de \u00e4ndras eftersom vi sa \u00e5t WordPress att randomisera dem. Obs: Om du har f\u00e4rre \u00e4n 3 inl\u00e4gg i samma kategori f\u00e5r du f\u00e4rre \u00e4n 3 inl\u00e4gg.<\/p>\n<p>Det \u00e4r allt! Nu vet du hur du fr\u00e5gar vilka inl\u00e4gg du vill. WP_Query <a href=\"https:\/\/developer.wordpress.org\/reference\/classes\/wp_query\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">-dokumentationssidan<\/a> \u00e4r extremt anv\u00e4ndbar f\u00f6r att justera din fr\u00e5ga, eftersom det verkligen finns obegr\u00e4nsade m\u00f6jligheter h\u00e4r. Jag uppmuntrar dig att leka med parametrarna, och kanske f\u00f6rs\u00f6ka g\u00f6ra en separat malldel att anv\u00e4nda f\u00f6r relaterade inl\u00e4gg.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I den h\u00e4r WordPress-temalektionen l\u00e4r du dig hur du skriver din egen fr\u00e5ga med inl\u00e4gg och g\u00e5r igenom dem utan att avbryta f\u00f6r\u00e4ldraslingan i mallen.<\/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":[932,901,724,838,848,901,922,1110,922,838,932,848,724,868,868],"tags":[1173],"class_list":["post-233874","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aemnen","category-koda","category-utvecklaren","category-guide-foer-nyboerjare","category-handledningar","category-oevrig","category-n-a","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=233874"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233874\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223852"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}