{"id":230674,"date":"2022-12-16T11:00:00","date_gmt":"2022-12-16T08:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230674"},"modified":"2022-12-07T11:40:18","modified_gmt":"2022-12-07T08:40:18","slug":"wordpress-paginering-ett-enkelt-verktyg-och-varfoer","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/wordpress-paginering-ett-enkelt-verktyg-och-varfoer\/","title":{"rendered":"WordPress-paginering: ett enkelt verktyg (och varf\u00f6r)"},"content":{"rendered":"\n<p>N\u00e4r man bygger mallar f\u00f6r WordPress har man i allm\u00e4nhet pagineringsfunktioner som kommer fr\u00e5n sj\u00e4lva applikationen.<\/p>\n<p>Dessa inkluderar saker som:<\/p>\n<ul>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_post()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_next_post_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_next_post_link()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_post\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_post()<\/a><\/li>\n<li><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_previous_post_link\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_previous_post_link()<\/a><\/li>\n<\/ul>\n<p>Och det finns n\u00e5gra andra inl\u00e4gg som ger dig st\u00f6rre granularitet kring taxonomier som <strong><a href=\"https:\/\/tommcfarlin.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">get_adjacent_post()<\/a><\/strong>.<\/p>\n<p>Jag rekommenderar att du l\u00e4ser alla ovanst\u00e5ende l\u00e4nkar eftersom de \u00e4r anv\u00e4ndbara om du bygger ett tema, arbetar med anpassade inl\u00e4ggstyper eller helt enkelt letar efter en djupare f\u00f6rst\u00e5else f\u00f6r n\u00e5gra av de vanliga malltaggarna.<\/p>\n<p>Om du d\u00e4remot letar efter ett enkelt s\u00e4tt att skriva ditt WordPress-pagineringsverktyg (vilket jag kommer att f\u00f6rklara motiveringen f\u00f6r ett \u00f6gonblick), s\u00e5 kommer resten av det h\u00e4r inl\u00e4gget att t\u00e4cka exakt det.<\/p>\n<h2>Anpassad WordPress-paginering<\/h2>\n<p>F\u00f6r det f\u00f6rsta, n\u00e4r du bygger en webbapplikation f\u00f6r n\u00e5gon, finns det s\u00e4kert nyanser d\u00e4r inbyggd WordPress-funktionalitet kanske inte fungerar. Kanske fungerar det inte som f\u00f6rv\u00e4ntat, det fungerar inte som det \u00e4r t\u00e4nkt eller s\u00e5 tj\u00e4nar det inte dina behov.<\/p>\n<p>Hur som helst, det betyder inte att paginering inte kan byggas f\u00f6r att tj\u00e4na dina syften. N\u00e4r allt kommer omkring \u00e4r k\u00e4rnan i paginering \u2013 s\u00e4rskilt n\u00e4r det g\u00e4ller enstaka efterpaginering \u2013 i grunden detta:<\/p>\n<p>Fr\u00e5n det aktuella inl\u00e4gget, se om ett inl\u00e4gg finns f\u00f6re det och se om ett inl\u00e4gg finns efter det. Om n\u00e5gon av inl\u00e4ggstyperna finns, ange en l\u00e4nk till det; annars g\u00f6r det inte.<\/p>\n<p>H\u00e4rifr\u00e5n kan vi fastst\u00e4lla att vi beh\u00f6ver f\u00f6ljande funktioner:<\/p>\n<ol>\n<li>ett s\u00e4tt att avg\u00f6ra om ett inl\u00e4gg finns bakom det aktuella inl\u00e4gget,<\/li>\n<li>ett s\u00e4tt att avg\u00f6ra om ett inl\u00e4gg finns efter det aktuella inl\u00e4gget,<\/li>\n<li>ett s\u00e4tt att h\u00e4mta ett givet inl\u00e4gg,<\/li>\n<li>ett s\u00e4tt att f\u00e5 permal\u00e4nken f\u00f6r det givna inl\u00e4gget.<\/li>\n<\/ol>\n<p>Jag arbetar dock f\u00f6r att vara v\u00e4ldigt noggrann i spr\u00e5ket ovan, eftersom ett inl\u00e4gg som ligger &quot;bakom&quot; eller &quot;efter&quot; ett visst inl\u00e4gg kanske inte har ett ID som \u00e4r ett mindre-\u00e4n-ID f\u00f6r det aktuella inl\u00e4gget.<\/p>\n<p>Det \u00e4r helt enkelt det f\u00f6rsta inl\u00e4gget som publiceras och kan h\u00e4mtas \u00e5t b\u00e5da h\u00e5llen, eller hur?<\/p>\n<p>S\u00e5 med det i \u00e5tanke betyder det att vi beh\u00f6ver tv\u00e5 fr\u00e5gor:<\/p>\n<ul>\n<li>en fr\u00e5ga f\u00f6r att h\u00e4mta inl\u00e4gget bakom det aktuella inl\u00e4gget,<\/li>\n<li>en fr\u00e5ga f\u00f6r att h\u00e4mta inl\u00e4gget efter det aktuella inl\u00e4gget.<\/li>\n<\/ul>\n<p>F\u00f6r det h\u00e4r exemplet antar jag att du har tillg\u00e5ng till det aktuella inl\u00e4ggets ID genom <strong><a href=\"https:\/\/developer.wordpress.org\/reference\/functions\/get_the_id\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">funktionen get_the_ID()<\/a><\/strong>.<\/p>\n<h3>F\u00e5 ett inl\u00e4gg bakom det aktuella inl\u00e4gget<\/h3>\n<p>F\u00f6r att g\u00f6ra detta m\u00e5ste vi skapa en enkel fr\u00e5ga som tar ett publicerat inl\u00e4gg fr\u00e5n databasen f\u00f6r den angivna inl\u00e4ggstypen, och som \u00e4r relaterad till positionen f\u00f6r det aktuella inl\u00e4gget.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-00-previous-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Vi kan g\u00f6ra detta<\/a><\/strong> genom att begr\u00e4nsa resultatupps\u00e4ttningen till ett, ordna resultaten i fallande ordning och j\u00e4mf\u00f6ra v\u00e4rdet p\u00e5 post-ID:t:<\/p>\n<pre><code>&lt;?php\n\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT *\n        FROM $wpdb-&gt;posts\n        WHERE ID &lt; (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 DESC) AND post_type = '%s'\n        AND post_status = '%s'\n        ORDER BY ID DESC\n        LIMIT 1\n        \",\n        get_the_ID(),\n        'acme-custom-post-type',\n        'publish',\n        'acme-custom-post-type',\n        'publish') );<\/code><\/pre>\n<p>Detta kommer att returnera en rad resultat som vi kommer att se hur vi hanterar om en stund.<\/p>\n<h3>F\u00e5 inl\u00e4gget efter det aktuella inl\u00e4gget<\/h3>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-01-next-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">F\u00f6r n\u00e4sta inl\u00e4gg<\/a><\/strong> skriver vi en liknande fr\u00e5ga. Men ist\u00e4llet letar vi efter n\u00e4sta v\u00e4rde som \u00e4r st\u00f6rre och som ligger f\u00f6re det nuvarande ID:t:<\/p>\n<pre><code>&lt;?php\n\nglobal $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        'acme-custom-post-type',\n        'publish',\n        'acme-custom-post-type',\n        'publish') );<\/code><\/pre>\n<p>Nu beh\u00f6ver vi n\u00e5gra funktioner f\u00f6r att avg\u00f6ra om inl\u00e4gg finns. Vi kan g\u00f6ra detta med resultatmatrisen som returneras.<\/p>\n<h3>Kontrollera om ett inl\u00e4gg finns<\/h3>\n<p>Observera att <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-03-has-previous-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i f\u00f6ljande exempel<\/a><\/strong> accepterar funktionen arrayen av resultat och returnerar helt enkelt om det finns ett tidigare inl\u00e4gg. Resultaten som skickas till den h\u00e4r funktionen b\u00f6r vara fr\u00e5n f\u00f6reg\u00e5ende inl\u00e4ggsfr\u00e5ga ovan.<\/p>\n<p>F\u00f6r det andra, notera att det \u00e4r privat. Du kanske vill g\u00f6ra din offentliga beroende p\u00e5 hur du vill konstruera dina mallar.<\/p>\n<pre><code>&lt;?php \n\/**\n * @param array $results the results of the query to determined if there are past posts\n *\n * @return bool true if there is a previous post; otherwise, false\n *\/\nprivate function hasPreviousPost($results)\n{\n    return isset($results[0]);\n}<\/code><\/pre>\n<p>Och sedan <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-04-has-next-post-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6r n\u00e4sta inl\u00e4gg<\/a><\/strong> ser det likadant ut, men kom ih\u00e5g att resultaten som skickas till den h\u00e4r funktionen kommer fr\u00e5n en annan fr\u00e5ga.<\/p>\n<pre><code>&lt;?php\n\/**\n * @param array $results the results of the query to determined if there are future posts\n *\n * @return bool true if there is a next post; otherwise, false\n *\/\nprivate function hasNextPost($results)\n{\n    return isset($results[0]);\n}<\/code><\/pre>\n<p>Och slutligen kan vi anv\u00e4nda dessa villkorliga funktioner f\u00f6r att f\u00e5 permal\u00e4nken.<\/p>\n<h3>Skaffa l\u00e4nken<\/h3>\n<p>Kom ih\u00e5g att det s\u00e4tt p\u00e5 vilket du anv\u00e4nder den h\u00e4r funktionen kan variera fr\u00e5n den implementering jag har tillhandah\u00e5llit. S\u00e5 om du inte beh\u00f6ver den ska vara privat, \u00e4ndra dess synlighet och anv\u00e4nd den i din mall efter <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/763a68936f225834bba671a3d0a8b9f6#file-05-get-post-link-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">behov<\/a><\/strong>.<\/p>\n<pre><code>&lt;?php\n\/**\n * @param array $results the results of the array from which to retrieve the post ID\n *\n * @return string the ID of the post to which we're going to link\n *\/\nprivate function getPostLink($results)\n{\n    return get_the_permalink($results[0]-&gt;ID);\n}<\/code><\/pre>\n<p>Slutligen, notera att den h\u00e4r funktionen accepterar resultaten som du skickar in i den fr\u00e5n endera fr\u00e5gan och kommer att h\u00e4mta ID-egenskapen fr\u00e5n det f\u00f6rsta indexet av resultaten.<\/p>\n<p>Detta beror p\u00e5 att resultaten \u00e4r begr\u00e4nsade till ett och det bygger p\u00e5 din anv\u00e4ndning av de villkorliga funktionerna. Det vill s\u00e4ga, du kan g\u00f6ra n\u00e5got som:<\/p>\n<ul>\n<li>om det finns ett n\u00e4sta inl\u00e4gg f\u00e5r du n\u00e4sta inl\u00e4ggsl\u00e4nk<\/li>\n<\/ul>\n<p>Men din implementering kan variera.<\/p>\n<h2>Varf\u00f6r beh\u00f6vs detta?<\/h2>\n<p>Det kanske inte beh\u00f6vs. Det \u00e4r hela grejen: Om du anv\u00e4nder WordPress out-of-the-box med v\u00e4ldigt lite anpassning eller till\u00e4gg och inte beh\u00f6ver g\u00f6ra n\u00e5got ut\u00f6ver vad det kan ge, kanske du inte beh\u00f6ver detta.<\/p>\n<p>Om du \u00e5 andra sidan letar efter ett s\u00e4tt att introducera WordPress sidnumreringsfunktionalitet p\u00e5 ett enda inl\u00e4gg, s\u00e5 \u00e4r detta ett s\u00e4tt att g\u00f6ra det som korrekt kan hantera fallet med inl\u00e4gg som \u00e4r av en specifik inl\u00e4ggstyp men inte t har sekventiella ID:n (och som bara fungerar med en publiceringsstatus).<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>N\u00e4r du bygger en webbapplikation finns det s\u00e4kert nyanser d\u00e4r inbyggd funktionalitet kanske inte fungerar. Du kan beh\u00f6va anpassad WordPress-paginering.<\/p>\n","protected":false},"author":1,"featured_media":236123,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,807,724,868],"tags":[1173],"class_list":["post-230674","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230674","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=230674"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230674\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236123"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230674"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230674"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}