{"id":233725,"date":"2023-02-21T13:51:00","date_gmt":"2023-02-21T10:51:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233725"},"modified":"2022-11-11T12:04:08","modified_gmt":"2022-11-11T09:04:08","slug":"opetusohjelma-mukautetut-url-paeaetepisteet-wordpress-rewrite-api-lla","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/opetusohjelma-mukautetut-url-paeaetepisteet-wordpress-rewrite-api-lla\/","title":{"rendered":"Opetusohjelma: Mukautetut URL-p\u00e4\u00e4tepisteet WordPress Rewrite API:lla"},"content":{"rendered":"\n<p>Oletko koskaan toivonut, ett\u00e4 voisit laajentaa yksitt\u00e4isi\u00e4 viestej\u00e4, sivuja tai mukautettuja viestityyppej\u00e4si mukautetulla mallilla, joka s\u00e4ilytt\u00e4\u00e4 oman URL-rakenteensa? WordPress <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rewrite API<\/a> :lla t\u00e4m\u00e4 on t\u00e4ysin mahdollista, eik\u00e4 ollenkaan vaikeaa.<\/p>\n<p>T\u00e4ss\u00e4 opetusohjelmassa tarkastelemme, kuinka yhden mukautetun viestityypin n\u00e4kym\u00e4 voidaan liitt\u00e4\u00e4 toiseen etaan, joka lataa eri mallin. Toisin sanoen, jos yksitt\u00e4isen muokatun viestityyppisen viestin URL-osoite on &quot;example.com\/destination\/venice\/&quot;, voit lis\u00e4t\u00e4 URL-s\u00e4\u00e4nt\u00f6j\u00e4 erillisille sivuille, jotka sis\u00e4lt\u00e4v\u00e4t kuhunkin kohteeseen liittyvi\u00e4 tietoja, esimerkiksi&quot;example.com\/destination\/venice \/activities\/&quot; ja &quot;example.com\/destination\/venice\/attractions\/&quot;.<\/p>\n<p>Jos olet kiinnostunut p\u00e4\u00e4tepisteiden lis\u00e4\u00e4misest\u00e4 WooCommercen &quot;Oma tili&#8221; -sivulle, minulla on <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\">toinen viesti<\/a> juuri t\u00e4st\u00e4!<\/p>\n<p>WordPress Rewrite API sis\u00e4lt\u00e4\u00e4 runsaasti hy\u00f6dyllisi\u00e4 toimintoja omien URL-s\u00e4\u00e4nt\u00f6jen kirjoittamiseen. Olet ehk\u00e4 n\u00e4hnyt tunnetuimman ja laajimman toiminnon; <code>add_rewrite_rule()<\/code>. T\u00e4m\u00e4 opetusohjelma kuitenkin k\u00e4ytt\u00e4\u00e4 samanlaista <code>add_rewrite_endpoint()<\/code>, joka on eritt\u00e4in hy\u00f6dyllinen URL-osoitteiden &quot;p\u00e4\u00e4tepisteiden&quot; lis\u00e4\u00e4miseen (periaatteessa mukautettujen URL-osoitteiden lis\u00e4\u00e4miseen jo olemassa olevan, esim. yksitt\u00e4isen viestin tai yksitt\u00e4isen luokan j\u00e4lkeen). Voit saavuttaa saman tuloksen k\u00e4ytt\u00e4m\u00e4ll\u00e4, <code>add_rewrite_rule()<\/code>mutta p\u00e4\u00e4tepisteiden lis\u00e4\u00e4minen on yksinkertaisempaa.<\/p>\n<h2>Mit\u00e4 teemme<\/h2>\n<p>T\u00e4ss\u00e4 oppaassa oletetaan, ett\u00e4 olemme luoneet kaksi mukautettua viestityyppi\u00e4; &quot;elokuva&quot; ja &quot;n\u00e4yttelij\u00e4&quot;. Pysyv\u00e4n linkin s\u00e4\u00e4nt\u00f6 yksitt\u00e4iselle elokuvalle on &quot;example.com\/movie\/fight-club\/&quot; ja yksitt\u00e4iselle n\u00e4yttelij\u00e4lle &quot;example.com\/actor\/brad-pitt\/&quot;. Haluamme jokaiselle elokuvalle erillisen sivun, joka n\u00e4ytt\u00e4\u00e4 kaikki kyseisen elokuvan n\u00e4yttelij\u00e4t, osoitteessa &quot;example.com\/movie\/fight-club\/actors\/&quot; ja vastaavasti erillisen sivun jokaiselle n\u00e4yttelij\u00e4lle, joka n\u00e4ytt\u00e4\u00e4 kaikki elokuvat, joissa n\u00e4yttelij\u00e4 on esiintynyt. sijaitsee osoitteessa &quot;example.com\/actor\/brad-pitt\/movies\/&quot;.<\/p>\n<p>En mene yksityiskohtiin n\u00e4iden kahden mukautetun viestityypin lis\u00e4\u00e4misest\u00e4. Jos tarvitset apua t\u00e4m\u00e4n osan tekemisess\u00e4, suosittelen lukemaan viestini <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-post-types-and-custom-taxonomies\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">mukautettujen viestityyppien lis\u00e4\u00e4misest\u00e4<\/a>.<\/p>\n<h2>Koodin kirjoittaminen<\/h2>\n<p>Ensimm\u00e4inen vaihe on kutsua <code>add_rewrite_endpoint()<\/code>sis\u00e4\u00e4n funktio, joka on koukussa <code>init<\/code>(yleens\u00e4 kaikki Rewrite API:n toiminnot on koukussa <code>init<\/code>). rekister\u00f6id\u00e4 kaksi haluttua p\u00e4\u00e4tepistett\u00e4mme; &quot;elokuvat&quot; ja &quot;n\u00e4yttelij\u00e4t&quot;. <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\/add_rewrite_endpoint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Funktiolla<\/a> on kaksi argumenttia; ensinn\u00e4kin haluamasi p\u00e4\u00e4tepiste (esim. &#8217;elokuvat&#8217;) ja toiseksi vakio, jossa p\u00e4\u00e4tepisteen pit\u00e4isi &quot;asua&quot; (esim. sivut, tekij\u00e4, arkistot jne.). Katso dokumentaatiosta, mihin vakioihin voit k\u00e4ytt\u00e4\u00e4; t\u00e4ss\u00e4 esimerkiss\u00e4 yleinen <code>EP_PERMALINK<\/code>on hyv\u00e4:<\/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>HUOM: Jos mukautettu viestityyppisi on hierarkkinen, eli siin\u00e4 on <code>'hierarchical' =&gt; true<\/code>, <code>register_post_type()<\/code>sinun on vaihdettava vakio <code>EP_PERMALINK<\/code>painikkeella <code>EP_PAGES<\/code>.<\/p>\n<p>Kun olet tallentanut t\u00e4m\u00e4n koodin, sinun on siirrytt\u00e4v\u00e4 kohtaan Asetukset &gt; Pysyv\u00e4t linkit ja napsauttamalla Tallenna-painiketta p\u00e4ivitt\u00e4\u00e4ksesi pysyv\u00e4t linkit. Aina kun lis\u00e4\u00e4t tai muokkaat uudelleenkirjoituss\u00e4\u00e4nt\u00f6\u00e4, sinun on p\u00e4ivitett\u00e4v\u00e4 pysyv\u00e4t linkit, jotta se toimisi!<\/p>\n<h3>Kyselyn k\u00e4sittely vars<\/h3>\n<p>Tapa, jolla sin\u00e4 teeman tai laajennuksen kehitt\u00e4j\u00e4n\u00e4 voit selvitt\u00e4\u00e4, n\u00e4ytet\u00e4\u00e4nk\u00f6 n\u00e4iden p\u00e4\u00e4tepisteiden mallit vai ei, on valinta &quot;query vars&quot;; pohjimmiltaan WordPressin globaali kyselyobjekti. Teemme t\u00e4m\u00e4n kutsumalla <code>get_query_var()<\/code>kyselyn argumenttina (&quot;elokuvat&quot; tai &quot;n\u00e4yttelij\u00e4t&quot;).<\/p>\n<p>Jos olet ty\u00f6skennellyt aiemmin <code>add_rewrite_rule()<\/code>tai <code>get_query_var()<\/code>aiemmin, saatat jo tiet\u00e4\u00e4, ett\u00e4 WordPress ei lis\u00e4\u00e4 automaattisesti mukautettuja kyselymuutoksia. Yleens\u00e4 sinun on suodatettava <code>query_vars<\/code>ja lis\u00e4tt\u00e4v\u00e4 mukautetut muuttujat saadaksesi WordPressin t\u00e4ytt\u00e4m\u00e4\u00e4n ne. Se kuitenkin <code>add_rewrite_endpoint()<\/code>tekee t\u00e4m\u00e4n automaattisesti puolestamme.<\/p>\n<p>Jos yrit\u00e4mme kuitenkin soittaa, <code>get_query_var('movies')<\/code>se ei koskaan n\u00e4yt\u00e4 olevan asetettuna. T\u00e4m\u00e4 johtuu siit\u00e4, ett\u00e4 se olettaa, ett\u00e4 sill\u00e4 on oltava arvo, jotta se voidaan asettaa. P\u00e4\u00e4tepistes\u00e4\u00e4nn\u00f6t olettavat, ett\u00e4 arvo on se, mik\u00e4 tulee p\u00e4\u00e4tepisteen j\u00e4lkeen. Esimerkiksi &quot;example.com\/actor\/brad-pitt\/movies\/some-value\/&quot; toimisi, koska t\u00e4ll\u00e4 sivulla <code>get_query_var('movies')<\/code>palautettaisiin arvo &quot;joku arvo&quot;. Mutta t\u00e4m\u00e4 ei ole sit\u00e4, mit\u00e4 haluamme, haluamme sen toimivan vain yhden p\u00e4\u00e4tepisteen kanssa. T\u00e4m\u00e4n ratkaisemiseksi meid\u00e4n on kytkeydytt\u00e4v\u00e4 WordPressin <code>request<\/code>suodattimeen ja ilmoitettava WordPressille, ett\u00e4 jos olemme p\u00e4\u00e4tepisteiss\u00e4mme, kyselyvarsien pit\u00e4isi lis\u00e4t\u00e4 p\u00e4\u00e4tepisteeseen jonkin verran arvoa (me vain asetamme sen arvoon <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>Jos yrit\u00e4t nyt k\u00e4ytt\u00e4\u00e4 <code>get_query_vars('movies')<\/code>when-toimintoa osoitteessa &quot;example.com\/actor\/brad-pitt\/movies\/&quot;, saat arvon <code>true<\/code>(t\u00e4rke\u00e4\u00e4 on, ett\u00e4 se on todella asetettu).<\/p>\n<h3>Ladataan mallia<\/h3>\n<p>Seuraava askel on p\u00e4\u00e4tt\u00e4\u00e4, mit\u00e4 n\u00e4ille kahdelle p\u00e4\u00e4tepisteelle pit\u00e4isi tapahtua; tai toisin sanoen mitk\u00e4 mallit haluat ladata. T\u00e4m\u00e4 osa on sinun p\u00e4\u00e4tett\u00e4viss\u00e4si, voit liitty\u00e4 siihen, <code>template_redirect<\/code>mutta se on todella suositeltavaa vain, jos haluat suorittaa varsinaisen uudelleenohjauksen. Suosittelen kiinnittym\u00e4\u00e4n <code>template_include<\/code>suodattimeen ja kertomaan WordPressille, mit\u00e4 malleja tulee k\u00e4ytt\u00e4\u00e4, kun olemme mukautetuissa p\u00e4\u00e4tepisteiss\u00e4mme. Oletetaan, ett\u00e4 teemassa on PHP-mallit <code>single-actor-movies.php<\/code>kohteille &quot;example.com\/actor\/\/movies\/&quot; ja <code>single-movie-actors.php<\/code>&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>Kun t\u00e4m\u00e4 suodatin on paikallaan, WordPressin tulisi ladata toimitetut mallit mukautetuille p\u00e4\u00e4tepisteillemme, ja n\u00e4iss\u00e4 malleissa globaali <code>$post<\/code>objekti olisi siihen liittyv\u00e4 yksitt\u00e4inen postausobjekti ennen p\u00e4\u00e4tepistett\u00e4 \u2013 esim. yhden toimijan post-objekti, kun olemme mallin luona n\u00e4ytt\u00e4m\u00e4\u00e4n kaikki elokuvissa, joissa n\u00e4yttelij\u00e4 on esiintynyt. N\u00e4in meid\u00e4n on helppo kysy\u00e4 tietoja, joita haluamme n\u00e4ytt\u00e4\u00e4.<\/p>\n<h2>Haetaan p\u00e4\u00e4tepisteesi URL-osoite<\/h2>\n<p>Mukautettujen p\u00e4\u00e4tepisteiden ja sivujen k\u00e4ytt\u00f6 on hienoa ja n\u00e4pp\u00e4r\u00e4\u00e4, mutta jossain sinun on linkitett\u00e4v\u00e4 niihin. Esimerkiksi yksitt\u00e4isen elokuvan malliin haluat linkin &quot;Katso kaikki n\u00e4yttelij\u00e4t&quot;, joka menee p\u00e4\u00e4tepisteeseesi.<\/p>\n<p>Valitettavasti t\u00e4t\u00e4 yksinkertaista WordPress-toimintoa ei ole olemassa. Sinun on luotava URL-osoite itse. Suosittelen k\u00e4ytt\u00e4m\u00e4\u00e4n <code>[get_site_url](https:\/\/developer.wordpress.org\/reference\/functions\/get_site_url\/)()<\/code>koko sivuston laajuisia p\u00e4\u00e4tepisteit\u00e4, tai yll\u00e4 olevassa tapauksessa viittaat tiettyyn viestiin <code>[get_the_permalink](https:\/\/developer.wordpress.org\/reference\/functions\/get_the_permalink\/)()<\/code>(joko silmukan sis\u00e4ll\u00e4 tai antamalla viestitunnuksen) ja liit\u00e4t p\u00e4\u00e4tepisteen sen j\u00e4lkeen, kuten:<\/p>\n<pre><code>echo get_the_permalink(). '\/actors';<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>T\u00e4m\u00e4 opetusohjelma n\u00e4ytt\u00e4\u00e4, kuinka voit laajentaa mukautettua viestityyppi\u00e4si mukautetulla mallilla, joka s\u00e4ilytt\u00e4\u00e4 oman URL-rakenteensa WordPress Rewrite API:n avulla.<\/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":[895,719,719,895,1110,834,843,834,843,864,864],"tags":[1166],"class_list":{"0":"post-233725","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-koodi","8":"category-kehittaejae","11":"category-n-a","12":"category-opas-aloittelijoille","13":"category-opetusohjelmia","16":"category-wordpress-5","18":"tag-affiai-fi"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233725","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=233725"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/233725\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/152349"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=233725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=233725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=233725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}