{"id":233693,"date":"2023-02-21T13:43:00","date_gmt":"2023-02-21T10:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233693"},"modified":"2022-11-11T08:54:38","modified_gmt":"2022-11-11T05:54:38","slug":"handledning-anpassade-url-slutpunkter-med-wordpress-rewrite-api","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/handledning-anpassade-url-slutpunkter-med-wordpress-rewrite-api\/","title":{"rendered":"Handledning: Anpassade URL-slutpunkter med WordPress Rewrite API"},"content":{"rendered":"\n<p>Har du n\u00e5gonsin \u00f6nskat att du kunde ut\u00f6ka enstaka inl\u00e4gg, sidor eller dina anpassade inl\u00e4ggstyper med en anpassad mall som har en egen URL-struktur? Med WordPress <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rewrite API<\/a> \u00e4r detta fullt m\u00f6jligt, och inte alls sv\u00e5rt.<\/p>\n<p>I den h\u00e4r handledningen kommer vi att titta p\u00e5 hur man l\u00e4gger till en anpassad inl\u00e4ggsvy med en annan slug som laddar en annan mall. Med andra ord, om ett enskilt inl\u00e4gg av typen anpassad inl\u00e4gg har webbadressen &quot;example.com\/destination\/venice\/&quot;, kan du l\u00e4gga till URL-regler f\u00f6r separata sidor med relaterad information till varje destination, till exempel&quot;example.com\/destination\/venice \/activities\/&quot; och &#8221;example.com\/destination\/venice\/attractions\/&#8221;.<\/p>\n<p>Om du \u00e4r intresserad av hur man l\u00e4gger till slutpunkter p\u00e5 WooCommerces &quot;Mitt konto&quot;-sida, har jag <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-add-custom-endpoints-to-my-account-page-in-woocommerce\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ett annat inl\u00e4gg<\/a> om just det!<\/p>\n<p>WordPress Rewrite API har massor av anv\u00e4ndbara funktioner f\u00f6r att skriva dina egna anpassade URL-regler. Du kanske har sett den mest k\u00e4nda och breda funktionen; <code>add_rewrite_rule()<\/code>. Denna handledning anv\u00e4nder dock liknande <code>add_rewrite_endpoint()<\/code>, vilket \u00e4r mycket anv\u00e4ndbart f\u00f6r att l\u00e4gga till URL-&#8221;slutpunkter&#8221; (i princip l\u00e4gga till anpassade URL-sluggar efter n\u00e5got som redan finns, t.ex. efter slutet av ett enstaka inl\u00e4gg eller en enda kategori). Du kan uppn\u00e5 samma resultat genom att anv\u00e4nda <code>add_rewrite_rule()<\/code>men processen att l\u00e4gga till slutpunkter \u00e4r enklare.<\/p>\n<h2>Vad vi ska g\u00f6ra<\/h2>\n<p>Denna guide kommer att anta att vi har skapat tv\u00e5 anpassade inl\u00e4ggstyper; &quot;film&quot; och &quot;sk\u00e5despelare&quot;. Permal\u00e4nkregeln f\u00f6r en enskild film \u00e4r &quot;example.com\/movie\/fight-club\/&quot; och f\u00f6r en enskild sk\u00e5despelare &quot;example.com\/actor\/brad-pitt\/&quot;. Vi vill ha en separat sida f\u00f6r varje film som visar alla sk\u00e5despelare i den filmen, som finns p\u00e5 &quot;example.com\/movie\/fight-club\/actors\/&quot; och p\u00e5 samma s\u00e4tt en separat sida f\u00f6r varje sk\u00e5despelare som visar alla filmer som sk\u00e5despelaren har varit med i, finns p\u00e5 &quot;example.com\/actor\/brad-pitt\/movies\/&quot;.<\/p>\n<p>Jag kommer inte att g\u00e5 in p\u00e5 detaljer om hur man l\u00e4gger till dessa tv\u00e5 anpassade inl\u00e4ggstyper; om du beh\u00f6ver hj\u00e4lp med att g\u00f6ra den h\u00e4r delen rekommenderar jag att du l\u00e4ser mitt inl\u00e4gg om <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-post-types-and-custom-taxonomies\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hur du l\u00e4gger till anpassade inl\u00e4ggstyper<\/a>.<\/p>\n<h2>Skriver koden<\/h2>\n<p>F\u00f6rsta steget \u00e4r att anropa <code>add_rewrite_endpoint()<\/code>en funktion som \u00e4r kopplad till <code>init<\/code>(i allm\u00e4nhet \u00e4r alla funktioner i Rewrite API kopplade till <code>init<\/code>). att registrera v\u00e5ra tv\u00e5 \u00f6nskade slutpunkter; &quot;filmer&quot; och &quot;sk\u00e5despelare&quot;. Funktionen <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\/add_rewrite_endpoint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tar<\/a> tv\u00e5 argument; f\u00f6rst den slutpunkt du vill ha (t.ex. &#8217;filmer&#8217;), och f\u00f6r det andra en konstant f\u00f6r var slutpunkten ska &quot;leva&quot; (t.ex. sidor, f\u00f6rfattare, arkiv, etc). Titta i dokumentationen f\u00f6r vilka konstanter du kan anv\u00e4nda; N\u00e4r det g\u00e4ller detta exempel \u00e4r det allm\u00e4nna <code>EP_PERMALINK<\/code>bra:<\/p>\n<pre><code>add_action('init', function() {\n    add_rewrite_endpoint('movies', EP_PERMALINK);\n    add_rewrite_endpoint('actors', EP_PERMALINK);\n});<\/code><\/pre>\n<p>OBS: Om din anpassade inl\u00e4ggstyp \u00e4r hierarkisk, vilket betyder att den har <code>'hierarchical' =&gt; true<\/code>i sin <code>register_post_type()<\/code>, m\u00e5ste du byta ut konstanten <code>EP_PERMALINK<\/code>med <code>EP_PAGES<\/code>.<\/p>\n<p>N\u00e4r du har sparat den h\u00e4r koden m\u00e5ste du g\u00e5 till Inst\u00e4llningar &gt; Permal\u00e4nkar och klicka p\u00e5 knappen Spara f\u00f6r att uppdatera permanenta l\u00e4nkar. N\u00e4r du l\u00e4gger till eller \u00e4ndrar en omskrivningsregel m\u00e5ste du uppdatera dina permal\u00e4nkar f\u00f6r att det ska fungera!<\/p>\n<h3>Hantera fr\u00e5gan vars<\/h3>\n<p>S\u00e4ttet som du som tema- eller plugin-utvecklare kan ta reda p\u00e5 om du vill visa mallarna f\u00f6r dessa slutpunkter eller inte, \u00e4r genom att markera &quot;query vars&quot;; i princip WordPress globala fr\u00e5geobjekt. Vi g\u00f6r detta genom att anropa <code>get_query_var()<\/code>med fr\u00e5gan som argument (&#8217;filmer&#8217; eller &#8217;sk\u00e5despelare&#8217;).<\/p>\n<p>Om du har arbetat med <code>add_rewrite_rule()<\/code>eller <code>get_query_var()<\/code>tidigare kanske du redan \u00e4r medveten om att WordPress inte automatiskt l\u00e4gger till anpassade fr\u00e5gevarianter. Vanligtvis m\u00e5ste du filtrera <code>query_vars<\/code>och l\u00e4gga till dina anpassade variabler f\u00f6r att f\u00e5 WordPress att fylla i dem. Men <code>add_rewrite_endpoint()<\/code>automatiskt g\u00f6r detta f\u00f6r oss.<\/p>\n<p>Men om vi f\u00f6rs\u00f6ker ringa <code>get_query_var('movies')<\/code>kommer det aldrig att tyckas vara inst\u00e4llt. Det beror p\u00e5 att det antar att det m\u00e5ste ha ett v\u00e4rde f\u00f6r att kunna st\u00e4llas in. Endpoint-regler f\u00f6ruts\u00e4tter att det som kommer efter endpointen \u00e4r v\u00e4rdet. Till exempel &quot;example.com\/actor\/brad-pitt\/movies\/some-value\/&quot; skulle fungera, eftersom p\u00e5 den h\u00e4r sidan <code>get_query_var('movies')<\/code>skulle returnera v\u00e4rdet &quot;some-value&quot;. Men det \u00e4r inte vad vi vill, vi vill att det ska fungera enbart med den enda slutpunkten. F\u00f6r att l\u00f6sa detta m\u00e5ste vi ansluta till WordPress <code>request<\/code>filter och informera WordPress om att om vi \u00e4r vid v\u00e5ra slutpunkter, b\u00f6r fr\u00e5gan vars l\u00e4gga till slutpunkten med n\u00e5got v\u00e4rde (vi st\u00e4ller bara in det till <code>true<\/code>).<\/p>\n<pre><code>add_filter('request', function($vars) {\n    if (isset($vars['movies'])) {\n        $vars['movies'] = true;\n    }\n    if (isset($vars['actors'])) {\n        $vars['actors'] = true;\n    }\n    return $vars;\n});<\/code><\/pre>\n<p>Om du nu f\u00f6rs\u00f6ker anv\u00e4nda <code>get_query_vars('movies')<\/code>n\u00e4r p\u00e5 &quot;example.com\/actor\/brad-pitt\/movies\/&quot; skulle du f\u00e5 v\u00e4rdet <code>true<\/code>(det viktiga \u00e4r att det faktiskt har st\u00e4llts in).<\/p>\n<h3>Laddar mall<\/h3>\n<p>N\u00e4sta steg \u00e4r att best\u00e4mma vad som ska h\u00e4nda p\u00e5 dessa tv\u00e5 endpoints; eller med andra ord vilka mallar du vill ladda. Den h\u00e4r delen \u00e4r upp till dig, du kan haka p\u00e5 <code>template_redirect<\/code>men det rekommenderas egentligen bara om du vill utf\u00f6ra en faktisk omdirigering. Jag rekommenderar att du kopplar in <code>template_include<\/code>filtret och ber\u00e4ttar helt enkelt f\u00f6r WordPress vilka mallar som ska anv\u00e4ndas n\u00e4r vi \u00e4r vid v\u00e5ra anpassade slutpunkter. L\u00e5t oss anta att temat har PHP-mallarna <code>single-actor-movies.php<\/code>f\u00f6r &quot;example.com\/actor\/\/movies\/ och <code>single-movie-actors.php<\/code>f\u00f6r &quot;example.com\/movie\/\/actors\/&quot;.<\/p>\n<pre><code>add_filter('template_include', function($template) {\n    if (is_singular() &amp;&amp; get_query_var('movies')) {\n        $post = get_queried_object();\n        return locate_template(['single-actor-movies.php']);\n    }\n    if (is_singular() &amp;&amp; get_query_var('actors')) {\n        $post = get_queried_object();\n        return locate_template(['single-movie-actors.php']);\n    }\n    return $template;\n});<\/code><\/pre>\n<p>Med detta filter p\u00e5 plats b\u00f6r WordPress ladda de tillhandah\u00e5llna mallarna f\u00f6r v\u00e5ra anpassade slutpunkter, och inom dessa mallar skulle det globala <code>$post<\/code>objektet vara det relaterade enstaka postobjektet f\u00f6re slutpunkten \u2013 t.ex. enakt\u00f6rspostobjektet n\u00e4r vi \u00e4r vid mallen f\u00f6r att visa alla filmer som sk\u00e5despelaren har medverkat i. Detta g\u00f6r det enkelt f\u00f6r oss att fr\u00e5ga efter den information vi vill visa.<\/p>\n<h2>H\u00e4mta URL:en till din slutpunkt<\/h2>\n<p>Att ha v\u00e5ra anpassade slutpunkter och sidor \u00e4r helt okej, men n\u00e5gonstans skulle du beh\u00f6va l\u00e4nka till dem. Till exempel i singelfilmsmallen vill du ha en l\u00e4nk &quot;Se alla sk\u00e5despelare&quot; som g\u00e5r till din slutpunkt.<\/p>\n<p>Tyv\u00e4rr finns det ingen s\u00e5 enkel WordPress-funktion f\u00f6r detta. Du m\u00e5ste bygga webbadressen sj\u00e4lv. Jag rekommenderar att du anv\u00e4nder <code>[get_site_url](https:\/\/developer.wordpress.org\/reference\/functions\/get_site_url\/)()<\/code>f\u00f6r \u00e4ndpunkter som omfattar hela webbplatsen, eller i ovanst\u00e5ende fall h\u00e4nvisar du till ett specifikt inl\u00e4gg med <code>[get_the_permalink](https:\/\/developer.wordpress.org\/reference\/functions\/get_the_permalink\/)()<\/code>(antingen i slingan eller genom att ange ett inl\u00e4ggs-ID) och l\u00e4gger till \u00e4ndpunkten efter det, som s\u00e5:<\/p>\n<pre><code>echo get_the_permalink(). '\/actors';<\/code><\/pre>\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>Den h\u00e4r handledningen visar hur du ut\u00f6kar din anpassade inl\u00e4ggstyp med en anpassad mall som beh\u00e5ller sin egen URL-struktur, med hj\u00e4lp av WordPress Rewrite API.<\/p>\n","protected":false},"author":1,"featured_media":152349,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[901,724,838,848,901,1110,838,848,724,868,868],"tags":[1173],"class_list":["post-233693","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-utvecklaren","category-guide-foer-nyboerjare","category-handledningar","category-n-a","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233693","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=233693"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233693\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/152349"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}