{"id":230626,"date":"2022-11-30T17:47:00","date_gmt":"2022-11-30T14:47:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230626"},"modified":"2022-11-09T23:15:55","modified_gmt":"2022-11-09T20:15:55","slug":"mukautetut-uudelleenkirjoitussaeaennoet-ja-sivumallit-wordpressissae","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/mukautetut-uudelleenkirjoitussaeaennoet-ja-sivumallit-wordpressissae\/","title":{"rendered":"Mukautetut uudelleenkirjoituss\u00e4\u00e4nn\u00f6t ja sivumallit WordPressiss\u00e4"},"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> on vankka API olettaen, ett\u00e4 olet tyytyv\u00e4inen s\u00e4\u00e4nn\u00f6llisiin lausekkeisiin.<\/p>\n<p>Ja rehellisesti sanottuna, vaikka et olisikaan, <strong><a href=\"https:\/\/www.phpliveregex.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Live RegExin<\/a><\/strong> kaltaisten ty\u00f6kalujen avulla on todella helppoa testata koodia ennen sen pudottamista <code>add_rewrite_rule<\/code>API-kutsuun.<\/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=\"Mukautetut uudelleenkirjoituss\u00e4\u00e4nn\u00f6t ja sivumallit WordPressiss\u00e4\" ><\/a><\/p>\n<p>Joskus saatat kuitenkin joutua tilanteeseen, jossa sinun on ty\u00f6skennelt\u00e4v\u00e4 uudelleenkirjoituss\u00e4\u00e4nt\u00f6jen ja sivupohjien kanssa. Ja kun n\u00e4in on, se ei aina ole niin yksinkertaista kuin yksinkertaisen kutsun soittaminen yhdell\u00e4 s\u00e4\u00e4nn\u00f6llisell\u00e4 lausekkeella.<\/p>\n<p>Syy? Jos sinulla on useita sivuja, jotka k\u00e4ytt\u00e4v\u00e4t samaa mallia, sivu ei aina tule olemaan samassa hakemistossa kullakin sivulla suoritettavassa kyselyss\u00e4.<\/p>\n<p>T\u00e4t\u00e4 tarkoitusta varten meid\u00e4n on k\u00e4sitelt\u00e4v\u00e4 sit\u00e4 hieman eri tavalla kuin esimerkiksi yksinkertaisesti p\u00e4\u00e4sy numeeriseen tietoindeksiin globaalissa kyselyss\u00e4.<\/p>\n<h2>Kirjoita s\u00e4\u00e4nn\u00f6t ja sivumallit uudelleen<\/h2>\n<p>Oletetaan ensin, ett\u00e4 meill\u00e4 on kaksi mallia (jotka eiv\u00e4t ole tietyss\u00e4 j\u00e4rjestyksess\u00e4):<\/p>\n<ol>\n<li>template-alpha.php<\/li>\n<li>template-beta.php<\/li>\n<\/ol>\n<p>Oletetaan sitten, ett\u00e4 haluamme m\u00e4\u00e4ritt\u00e4\u00e4 mukautetun URL-osoitteen sivuille, joilla jokainen k\u00e4ytt\u00e4\u00e4 jotakin n\u00e4ist\u00e4 malleista.<\/p>\n<p>T\u00e4m\u00e4 jakautuisi seuraaviin vaiheisiin:<\/p>\n<ol>\n<li>Iteroi kyselyn viestit,<\/li>\n<li>Tallenna viesti k\u00e4ytt\u00e4m\u00e4ll\u00e4 mallia sen vastaavassa taulukossa,<\/li>\n<li>Aseta uudelleenkirjoituss\u00e4\u00e4nn\u00f6t jokaiselle viestille, jolla on tietty kysely.<\/li>\n<\/ol>\n<p>T\u00e4ss\u00e4 esimerkiss\u00e4 pid\u00e4n uudelleenkirjoituss\u00e4\u00e4nn\u00f6t melko yksinkertaisina. Loppujen lopuksi s\u00e4\u00e4nn\u00f6llisten lausekkeiden noudattaminen voi olla tarpeeksi vaikeaa, joten niiden seuraaminen Query-objektin, useiden taulukoiden ja s\u00e4\u00e4nt\u00f6jen k\u00e4sittelyn aikana voi olla v\u00e4h\u00e4n vaikeaa.<\/p>\n<p>T\u00e4ss\u00e4 on esimerkkikoodi, joka on eritelty yll\u00e4 olevien vaiheiden perusteella. Viestin lopussa jaan katkelman, joka yhdist\u00e4\u00e4 kaiken muutamaksi erilliseksi funktioksi, jotta voit n\u00e4hd\u00e4, kuinka t\u00e4m\u00e4 kaikki sopii yhteen.<\/p>\n<p>N\u00e4in voit k\u00e4sitell\u00e4 kaikkia yll\u00e4 olevia asioita.<\/p>\n<h3>1 Uudelleenkirjoituss\u00e4\u00e4nt\u00f6jen lis\u00e4\u00e4minen<\/h3>\n<p>Ensin meid\u00e4n on luettava joitakin tietoja maailmanlaajuisesta WordPress-kyselyobjektista l\u00f6yt\u00e4\u00e4ksemme kaikki sivut, joihin on k\u00e4ytetty malleja.<\/p>\n<p>T\u00e4t\u00e4 varten voimme lukea tiedot <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-00-read-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">globaalista kyselyobjektista paikalliseen muuttujaan<\/a><\/strong>. T\u00e4m\u00e4n ansiosta on helppo irrottaa muusta koodista, jos ei ole mit\u00e4\u00e4n, mink\u00e4 kanssa ty\u00f6skennell\u00e4.<\/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 Tallenna asiaankuuluvat tiedot taulukkoon<\/h3>\n<p>Olettaen, ett\u00e4 sivuilla on malleja, jatkamme <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-001-store-templated-pages-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kunkin sivun<\/a><\/strong> tallentamista taulukoihin, jotta voimme helposti hallita niit\u00e4 vastaavia uudelleenkirjoituss\u00e4\u00e4nt\u00f6j\u00e4.<\/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>Huomaa, ett\u00e4 edell\u00e4 viittaan globaaliin taulukkoon. Oletetaan, ett\u00e4 t\u00e4m\u00e4 on yksinkertaisesti alustettu tyhj\u00e4ksi taulukoksi luokan rakentajassa.<\/p>\n<h3>3 M\u00e4\u00e4rit\u00e4 uudelleenkirjoituss\u00e4\u00e4nn\u00f6t<\/h3>\n<p>Nyt kun meill\u00e4 on kaksi taulukkoa \u2013 yksi kullekin mallille ja sen sis\u00e4lt\u00e4ville sivuille \u2013 voimme iteroida niit\u00e4 ja m\u00e4\u00e4ritt\u00e4\u00e4 uudelleenkirjoituss\u00e4\u00e4nn\u00f6t kullekin sivulle.<\/p>\n<p>Oletetaan esimerkiksi, ett\u00e4 yhdelle mallille, esimerkiksi alfalle, haluamme m\u00e4\u00e4ritt\u00e4\u00e4 uudelleenkirjoituss\u00e4\u00e4nn\u00f6t Yhdysvaltoja ja osavaltioita varten.<\/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\">T\u00e4ss\u00e4 koodi<\/a><\/strong> kohteelle<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>Ja t\u00e4ss\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-03-acme-id-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koodi<\/a><\/strong> :<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>Tietenkin yll\u00e4 olevassa koodissa k\u00e4ytetyt s\u00e4\u00e4nn\u00f6lliset lausekkeet ovat vain esittelytarkoituksia. Sinun on kaikki mit\u00e4 tarvitset projektiisi.<\/p>\n<h3>4 Kaikki yhdess\u00e4 nyt<\/h3>\n<p>On t\u00e4rke\u00e4\u00e4 jakaa kaikki t\u00e4m\u00e4 toiminnallisuus omiin menetelmiins\u00e4, jotta ne voidaan tarvittaessa helposti kapseloida ja testata.<\/p>\n<p>T\u00e4t\u00e4 varten <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-04-final-functions-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koko koodi<\/a><\/strong> n\u00e4ytt\u00e4\u00e4 t\u00e4lt\u00e4:<\/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>Muista kuitenkin; t\u00e4m\u00e4 perustuu vain t\u00e4ss\u00e4 viestiss\u00e4 jaettuun demokoodiin. Kun ty\u00f6skentelet projektisi parissa, s\u00e4\u00e4nn\u00f6lliset lausekkeet, mallit ja niin edelleen vaihtelevat.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Joskus saatat joutua tilanteeseen, jossa sinun on ty\u00f6skennelt\u00e4v\u00e4 uudelleenkirjoituss\u00e4\u00e4nt\u00f6jen ja sivupohjien kanssa.<\/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":[719,895,843,864],"tags":[1166],"class_list":["post-230626","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230626"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230626\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/163544"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}