{"id":230619,"date":"2022-12-15T19:59:00","date_gmt":"2022-12-15T16:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230619"},"modified":"2022-12-07T11:39:17","modified_gmt":"2022-12-07T08:39:17","slug":"anpassade-arkivmallar-en-kort-guide","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/anpassade-arkivmallar-en-kort-guide\/","title":{"rendered":"Anpassade arkivmallar: En kort guide"},"content":{"rendered":"\n<p>N\u00e4r du arbetar med arkivmallar i WordPress listas inl\u00e4gg vanligtvis efter datum i fallande ordning. Det vill s\u00e4ga, de senaste inl\u00e4ggen listas \u00f6verst, och sedan g\u00e5r det d\u00e4rifr\u00e5n.<\/p>\n<p>P\u00e5 sistone har jag arbetat med n\u00e5gra projekt som integreras med tredjeparts API:er. Dessa API:er returnerar datum \u2013 ibland tv\u00e5 datum, ett startdatum och ett slutdatum \u2013 f\u00f6r en given h\u00e4ndelse och kunder vill anv\u00e4nda den informationen f\u00f6r att lista inl\u00e4gg snarare \u00e4n datumet f\u00f6r inl\u00e4gget. Det vill s\u00e4ga att de vill ha anpassade arkivmallar.<\/p>\n<p>Det \u00e4r inte s\u00e5 sv\u00e5rt att g\u00f6ra det h\u00e4r, men innan du g\u00f6r det tycker jag att det \u00e4r viktigt att ge lite bakgrundsinformation om hur projektet \u00e4r byggt s\u00e5 att det finns lite mer sammanhang kring varf\u00f6r, till exempel, en anpassad fr\u00e5ga beh\u00f6vs och varf\u00f6r du kan eller kanske beh\u00f6ver inte titta p\u00e5 <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>.<\/p>\n<p>Jag b\u00f6rjar dock med en TL;DR f\u00f6rst. P\u00e5 s\u00e5 s\u00e4tt kan du f\u00e5 id\u00e9n innan du l\u00e4ser det hela.<\/p>\n<h2>Anpassade arkivmallar<\/h2>\n<p>S\u00e5 TL;DR bakom det hela \u00e4r detta:<\/p>\n<ul>\n<li>datuminformationen som tillhandah\u00e5lls av tredje parts API sparas i post-metadatatabellen,<\/li>\n<li>nyckeln \u00e4r startdatumet och v\u00e4rdet \u00e4r det faktiska datumet,<\/li>\n<li>Jag best\u00e4ller inneh\u00e5llet i fallande ordning och efter metav\u00e4rdet.<\/li>\n<\/ul>\n<p>Paginering kan vara lite av ett problem, och om du anv\u00e4nder en anpassad inl\u00e4ggstyp beh\u00f6ver du n\u00e5gra extra parametrar, men det finns den allm\u00e4nna id\u00e9n.<\/p>\n<p>Nu till hela uppl\u00e4gget.<\/p>\n<h3>Anpassade inl\u00e4ggstyper<\/h3>\n<p>N\u00e4r det kommer till gr\u00e4nssnitt med tredje parts API:er \u00e4r jag ett stort fan av anpassade inl\u00e4ggstyper eftersom jag tenderar att t\u00e4nka p\u00e5 dem som en hybrid mellan modeller och vyer.<\/p>\n<ul>\n<li>Modellkomponenten inkluderar allt som \u00e4r tangentiellt relaterat och kan skrivas till databasen. Detta inneb\u00e4r all taxonomiinformation eller postmetadata.<\/li>\n<li>View-komponenten \u00e4r i allm\u00e4nhet allt som g\u00e5r in i mallen som kan utnyttja alla redan existerande malltaggar \u00e4r allt som kan beh\u00f6va skapas som ocks\u00e5 l\u00e4ser information fr\u00e5n databasen.<\/li>\n<\/ul>\n<p>F\u00f6r det h\u00e4r inl\u00e4gget kommer jag att anv\u00e4nda <strong>acme-event<\/strong> som den anpassade posttypen.<\/p>\n<h3>L\u00e4gg upp metadata<\/h3>\n<p>Jag st\u00e4ller in datumen i inl\u00e4ggets metadata snarare \u00e4n i sj\u00e4lva inl\u00e4gget, f\u00f6r om n\u00e5got kommer att h\u00e4nda i framtiden och data st\u00e4lls in p\u00e5 sj\u00e4lva postposten, kommer WordPress att behandla det som ett <strong>schemalagt<\/strong> inl\u00e4gg som \u00e4r opublicerat .<\/p>\n<\/p>\n<p>Ist\u00e4llet vill jag hellre ha inl\u00e4gget publicerat och sedan \u00e4ndra hur metadata visas i mallen.<\/p>\n<h3>Paginering<\/h3>\n<p>WordPress g\u00f6r en subtil skillnad med paginering i sin kodbas. Det vill s\u00e4ga att fr\u00e5gevariabeln f\u00f6r webbplatser utan en statisk hemsida anv\u00e4nder <strong>paged<\/strong> och det motsatta fallet anv\u00e4nder <strong>page<\/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=\"Anpassade arkivmallar: En kort guide\" ><\/a><\/p>\n<p>Det h\u00e4r spelar roll n\u00e4r du konstruerar argumenten f\u00f6r fr\u00e5gan som jag kommer till ett \u00f6gonblick.<\/p>\n<h3>Endast arkivsidor<\/h3>\n<p>Kom ih\u00e5g att n\u00e4r du introducerar sidnumrering vill du bara \u00e4ndra fr\u00e5gan n\u00e4r du \u00e4r p\u00e5 den faktiska arkivsidan.<\/p>\n<p>Det betyder att du inte bryr dig om fall n\u00e4r du \u00e4r i det administrativa omr\u00e5det f\u00f6r WordPress och du inte vill \u00e4ndra fr\u00e5gan f\u00f6r arkiv av icke-anpassad posttyp. F\u00f6r det \u00e4ndam\u00e5let vill du se till att du st\u00e4ller in fr\u00e5gevariabeln korrekt i pre_get_posts-\u00e5teruppringningen.<\/p>\n<p>Observera att jag kan visa en funktion f\u00f6r hur man g\u00f6r detta, men p\u00e5 grund av hur vi skriver kod i WordPress \u2013 det vill s\u00e4ga vissa skriver procedurkod, andra skriver objektorienterad kod \u2013 s\u00e5 visar jag det helt enkelt i procedurkod.<\/p>\n<h3>Att f\u00f6ra ihop allt<\/h3>\n<p>F\u00f6rst <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-00-custom-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ska jag bygga fr\u00e5gan:<\/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>Observera att i koden ovan finns ett argument f\u00f6r <strong>paged<\/strong>. Jag ska prata om koden f\u00f6r detta ett \u00f6gonblick.<\/p>\n<p>D\u00e5 kommer mallen att inneh\u00e5lla all information du v\u00e4ljer att visa. Jag v\u00e4ljer att inte dela koden f\u00f6r min mall i det h\u00e4r inl\u00e4gget eftersom det \u00e4r irrelevant f\u00f6r den st\u00f6rre id\u00e9n som finns.<\/p>\n<p>Dessutom har du allt du beh\u00f6ver f\u00f6r att visa inneh\u00e5llet.<\/p>\n<p>D\u00e4refter ska jag st\u00e4lla in paginering. F\u00f6rst m\u00e5ste jag g\u00f6ra detta med pre_get_posts-kroken f\u00f6r att <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-01-pre-get-posts-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se till att r\u00e4tt fr\u00e5gevariabel \u00e4r inst\u00e4lld<\/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>Sedan implementerar jag <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-02-pagination-links-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pagineringen<\/a> med hj\u00e4lp av den anpassade fr\u00e5gan:<\/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>Och efter det kommer <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac#file-03-reset-post-data-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jag att \u00e5terst\u00e4lla den globala $post-variabeln<\/a> med wp_reset_postdata() ifall n\u00e5gonting fr\u00e5n det ursprungliga inl\u00e4gget beh\u00f6ver anv\u00e4ndas.<\/p>\n<pre><code>&lt;?php wp_reset_postdata(); ?&gt;<\/code><\/pre>\n<p>Detta anses generellt sett vara bra hush\u00e5llning n\u00e4r du anv\u00e4nder en anpassad fr\u00e5ga i alla fall.<\/p>\n<h3>Anv\u00e4ndbara l\u00e4nkar<\/h3>\n<p>Nedan finns en lista \u00f6ver funktioner, sidor och referenser som du kan ha nytta av n\u00e4r det g\u00e4ller koden ovan eller eventuellt framtida arbete du kan g\u00f6ra.<\/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_Query<\/a><\/li>\n<li><a href=\"https:\/\/codex.wordpress.org\/Pagination\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Paginering<\/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>Hela <a href=\"https:\/\/gist.github.com\/tommcfarlin\/b1b2c403a39ebb8b907a328ab10148ac\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koden<\/a> i detta inl\u00e4gg.<\/li>\n<\/ul>\n<p>Om du har arbetat med WordPress l\u00e4nge kan vissa av dessa verka \u00f6verfl\u00f6diga. I andra fall kan det verka nytt, eller s\u00e5 kan det kasta ljus \u00f6ver delar av WordPress API:er som du inte visste fanns (\u00e5tminstone var det fallet f\u00f6r mig).<\/p>\n<h2>Varf\u00f6r bry sig om allt detta?<\/h2>\n<p>Det h\u00e4r kan se ut som ett l\u00e5ngt inl\u00e4gg f\u00f6r en till synes enkel uppgift, men informationen \u00e4r lite spridd \u00f6ver hela webben n\u00e4r det g\u00e4ller att g\u00f6ra n\u00e5got s\u00e5dant h\u00e4r.<\/p>\n<p>S\u00e5 jag ville f\u00f6rs\u00f6ka f\u00e5 ihop det hela med f\u00f6rklaringar, exempelkod och l\u00e4nkar till sidor som kan vara av intresse beroende p\u00e5 hur implementeringen g\u00e5r till.<\/p>\n<p>N\u00e4r allt kommer omkring anv\u00e4nder m\u00e5nga av oss WordPress ut\u00f6ver grundl\u00e4ggande inneh\u00e5llshantering vid det h\u00e4r laget, men det betyder inte att vi inte b\u00f6r utnyttja dess inbyggda funktioner och API:er n\u00e4r det \u00e4r m\u00f6jligt.<\/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>Se detta som en snabbkurs i att skapa anpassade arkivmallar och all funktionalitet som omger dem.<\/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":[901,807,724,868],"tags":[1173],"class_list":["post-230619","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\/230619","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=230619"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230619\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236214"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230619"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230619"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}