{"id":230035,"date":"2022-11-30T17:23:00","date_gmt":"2022-11-30T14:23:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230035"},"modified":"2022-11-09T19:48:31","modified_gmt":"2022-11-09T16:48:31","slug":"anpassade-omskrivningsregler-och-sidmallar-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/anpassade-omskrivningsregler-och-sidmallar-i-wordpress\/","title":{"rendered":"Anpassade omskrivningsregler och sidmallar i WordPress"},"content":{"rendered":"\n<p>WordPress <strong><a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rewrite API<\/a><\/strong> \u00e4r ett solidt API f\u00f6rutsatt att du \u00e4r bekv\u00e4m med regulj\u00e4ra uttryck.<\/p>\n<p>Och \u00e4rligt talat, \u00e4ven om du inte \u00e4r det, s\u00e5 g\u00f6r verktyg som <strong><a href=\"https:\/\/www.phpliveregex.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Live RegEx<\/a><\/strong> det v\u00e4ldigt enkelt att testa din kod innan du sl\u00e4pper den i <code>add_rewrite_rule<\/code>API-anropet.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-163543-61e7543bc96ee.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-163543-61e7543bc96ee.png\" alt=\"Anpassade omskrivningsregler och sidmallar i WordPress\" ><\/a><\/p>\n<p>Det finns dock tillf\u00e4llen d\u00e5 du kan hamna i en situation d\u00e4r du beh\u00f6ver arbeta med omskrivningsregler och sidmallar. Och n\u00e4r s\u00e5 \u00e4r fallet \u00e4r det inte alltid lika enkelt som att ringa ett enkelt samtal med ett enda regulj\u00e4rt uttryck.<\/p>\n<p>Anledningen? Om du har flera sidor som anv\u00e4nder samma mall, kommer du inte alltid att ha sidan placerad i samma index i fr\u00e5gan som k\u00f6rs p\u00e5 varje sida.<\/p>\n<p>F\u00f6r det \u00e4ndam\u00e5let m\u00e5ste vi hantera det p\u00e5 ett lite annorlunda s\u00e4tt \u00e4n att till exempel bara komma \u00e5t ett numeriskt index med information i den globala fr\u00e5gan.<\/p>\n<h2>Skriv om regler och sidmallar<\/h2>\n<p>L\u00e5t oss f\u00f6rst anta att vi har tv\u00e5 mallar (som inte \u00e4r i n\u00e5gon speciell ordning):<\/p>\n<ol>\n<li>mall-alpha.php<\/li>\n<li>mall-beta.php<\/li>\n<\/ol>\n<p>Och l\u00e5t oss sedan s\u00e4ga att vi vill skapa en anpassad URL f\u00f6r sidor som var och en anv\u00e4nder en av dessa mallar.<\/p>\n<p>Detta skulle delas upp i f\u00f6ljande steg:<\/p>\n<ol>\n<li>Iterera genom inl\u00e4ggen i fr\u00e5gan,<\/li>\n<li>Lagra inl\u00e4gget med mallen i dess respektive array,<\/li>\n<li>St\u00e4ll in omskrivningsreglerna f\u00f6r varje inl\u00e4gg som har en given fr\u00e5ga.<\/li>\n<\/ol>\n<p>F\u00f6r det h\u00e4r exemplet kommer jag att h\u00e5lla omskrivningsreglerna ganska enkla. N\u00e4r allt kommer omkring kan regulj\u00e4ra uttryck vara tillr\u00e4ckligt sv\u00e5ra att f\u00f6lja, s\u00e5 att f\u00f6rs\u00f6ka f\u00f6lja dem n\u00e4r du hanterar fr\u00e5geobjektet, flera arrayer och hantera reglerna kan vara lite mycket.<\/p>\n<p>Med det sagt, h\u00e4r \u00e4r exempelkoden som \u00e4r uppdelad baserat p\u00e5 stegen ovan. I slutet av inl\u00e4gget kommer jag att dela ett utdrag som samlar allt i n\u00e5gra separata funktioner s\u00e5 att du kan se hur allt detta h\u00e4nger ihop.<\/p>\n<p>Med det sagt, s\u00e5 h\u00e4r hanterar du allt ovanst\u00e5ende.<\/p>\n<h3>1 L\u00e4gga till omskrivningsregler<\/h3>\n<p>F\u00f6rst m\u00e5ste vi l\u00e4sa lite information fr\u00e5n det globala WordPress-fr\u00e5geobjektet f\u00f6r att hitta alla sidor som har mallar applicerade p\u00e5 dem.<\/p>\n<p>F\u00f6r att g\u00f6ra detta kan vi l\u00e4sa informationen <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-00-read-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fr\u00e5n det globala fr\u00e5geobjektet till en lokal variabel<\/a><\/strong>. Detta g\u00f6r det enkelt att undvika resten av koden om det inte finns n\u00e5got att arbeta med.<\/p>\n<pre><code>&lt;?php \n\n$query = $this-&gt;query-&gt;query([\n    'post_type' =&gt; 'page',\n    'meta_key' =&gt; '_wp_page_template',\n    'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n]);\n\nif (!$query) {\n    return;\n}\n\n\/\/ More to come...\n<\/code><\/pre>\n<h3>2 Lagra relevant information i en array<\/h3>\n<p>Om vi \u200b\u200bantar att det finns sidor med mallar, forts\u00e4tter vi med att <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-001-store-templated-pages-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">lagra var och en av sidorna<\/a><\/strong> i arrayer s\u00e5 att vi enkelt kan hantera deras respektive omskrivningsregler.<\/p>\n<pre><code>&lt;?php\n\nforeach ($query as $post) {\n    $slug = get_page_template_slug($post-&gt;ID);\n\n    if ('template-alpha.php' === $slug) {\n        $this-&gt;alphaPages[] = $post;\n    }\n\n    if ('template-find-a-camp.php' === $slug) {\n        $this-&gt;betaPages[] = $post;\n    }\n}\n<\/code><\/pre>\n<p>Observera att i ovanst\u00e5ende refererar jag till en global array. Antag att detta helt enkelt initieras som en tom array i klassens konstruktor.<\/p>\n<h3>3 St\u00e4ll in omskrivningsreglerna<\/h3>\n<p>Nu n\u00e4r vi har tv\u00e5 arrayer \u2013 en f\u00f6r varje mall och sidorna som inneh\u00e5ller den \u2013 kan vi iterera igenom dem och tilldela omskrivningsregler f\u00f6r var och en av dessa sidor.<\/p>\n<p>L\u00e5t oss till exempel s\u00e4ga att f\u00f6r en mall, s\u00e4g alfa, vill vi st\u00e4lla in omskrivningsregler f\u00f6r USA och stater.<\/p>\n<p><strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-02-country-state-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">H\u00e4r \u00e4r koden<\/a><\/strong> f\u00f6r<code>template-alpha.php<\/code>:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%country%', '([^&amp;]+)');\nadd_rewrite_tag('%state%', '([^&amp;]+)');\n\nforeach ($this-&gt;alphaPages as $post) {\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n        'top'\n    );\n\n    add_rewrite_rule(\n        '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Och <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-03-acme-id-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4r \u00e4r koden<\/a><\/strong> f\u00f6r <code>template-beta.php<\/code>:<\/p>\n<pre><code>&lt;?php\n\nadd_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\nforeach ($this-&gt;betaPages as $post) {\n    add_rewrite_rule(\n        '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n        'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n        'top'\n    );\n}\n<\/code><\/pre>\n<p>Naturligtvis \u00e4r de regulj\u00e4ra uttrycken som anv\u00e4nds i koden ovan endast f\u00f6r demonstrations\u00e4ndam\u00e5l. Din kommer att vara f\u00f6r allt som beh\u00f6vs f\u00f6r ditt projekt.<\/p>\n<h3>4 Alla tillsammans nu<\/h3>\n<p>Det \u00e4r viktigt att dela upp all denna funktionalitet i sina egna metoder s\u00e5 att allt enkelt kan kapslas in och testas vid behov.<\/p>\n<p>F\u00f6r detta \u00e4ndam\u00e5l, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-04-final-functions-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r kommer den fullst\u00e4ndiga koden<\/a><\/strong> att se ut:<\/p>\n<pre><code>&lt;?php\n\npublic function addRewriteRules()\n{\n    $query = $this-&gt;query-&gt;query([\n        'post_type' =&gt; 'page',\n        'meta_key' =&gt; '_wp_page_template',\n        'meta_value' =&gt; ['template-alpha.php', 'template-beta.php'],\n    ]);\n\n    if (!$query) {\n        return;\n    }\n\n    $this-&gt;setPageTypes($query);\n    $this-&gt;setAlphaRewriteRules();\n    $this-&gt;setBetaRewriteRules();\n}\n\nprivate function setPageTypes($query)\n{\n    foreach ($query as $post) {\n        $slug = get_page_template_slug($post-&gt;ID);\n\n        if ('template-alpha.php' === $slug) {\n            $this-&gt;alphaPages[] = $post;\n        }\n\n        if ('template-find-a-camp.php' === $slug) {\n            $this-&gt;betaPages[] = $post;\n        }\n    }\n}\n\nprivate function setAlphaRewriteRules()\n{\n    add_rewrite_tag('%country%', '([^&amp;]+)');\n    add_rewrite_tag('%state%', '([^&amp;]+)');\n\n    foreach ($this-&gt;alphaRules as $post) {\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]&amp;state=$matches[2]',\n            'top'\n        );\n\n        add_rewrite_rule(\n            '^'.$post-&gt;post_name.'\/([^\/]*)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;country=$matches[1]',\n            'top'\n        );\n    }\n}\n\nprivate function setBetaRewriteRules()\n{\n    add_rewrite_tag('%acme-id%', '([^&amp;]+)');\n\n    foreach ($this-&gt;betaPages as $post) {\n        add_rewrite_rule(\n            '^(.*)?\/([A-Za-z0-9-]+-)(d+)\/?',\n            'index.php?page_id='.$post-&gt;ID.'&amp;acme-id=$matches[3]',\n            'top'\n        );\n    }\n}\n<\/code><\/pre>\n<p>Kom dock ih\u00e5g; detta \u00e4r bara baserat p\u00e5 demokoden som delas i det h\u00e4r inl\u00e4gget. N\u00e4r du arbetar med ditt projekt kommer de regulj\u00e4ra uttrycken, mallarna och s\u00e5 vidare att variera.<\/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>Det finns tillf\u00e4llen d\u00e5 du kan hamna i en situation d\u00e4r du beh\u00f6ver arbeta med omskrivningsregler och sidmallar.<\/p>\n","protected":false},"author":1,"featured_media":163544,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,901,724,868],"tags":[1173],"class_list":["post-230035","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230035","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=230035"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230035\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/163544"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}