{"id":231004,"date":"2022-12-10T14:31:00","date_gmt":"2022-12-10T11:31:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231004"},"modified":"2022-12-07T12:07:37","modified_gmt":"2022-12-07T09:07:37","slug":"vaihtoehto-wordpress-template_redirect-hookille","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/vaihtoehto-wordpress-template_redirect-hookille\/","title":{"rendered":"Vaihtoehto WordPress template_redirect Hookille"},"content":{"rendered":"\n<p>Suurin osa t\u00e4ll\u00e4 hetkell\u00e4 tekem\u00e4st\u00e4ni ty\u00f6st\u00e4 keskittyy mukautettuihin laajennuksiin tai apuohjelmiin, jotka toimivat WordPressin p\u00e4\u00e4ll\u00e4.<\/p>\n<p>Jos k\u00e4sittelisit kuinka monta rakentamistani projekteista on koottu, tarkastelisit WordPressin (ja kaiken sen sis\u00e4lt\u00e4m\u00e4n) perustana, ja sitten koodissa on kerros, joka kommunikoi WordPressin kanssa ja joka saattaa kommunikoida. kolmannen osapuolen sovellusliittymien kanssa.<\/p>\n<p>T\u00e4t\u00e4 teht\u00e4ess\u00e4 on kuitenkin usein k\u00e4ytt\u00f6liittym\u00e4komponentti, joka edellytt\u00e4\u00e4 tietojen muuntamista malleiksi. Vaikka WordPressin mallien luominen ei ole luonnostaan \u200b\u200bvaikeita (vaikka toivoisin, ett\u00e4 meill\u00e4 olisi enemm\u00e4n kuin mallitunnisteita \u2013 kuten mallimoottori, se on toinen viesti), mielest\u00e4ni kannattaa tarkastella paria tapaa, joilla voimme k\u00e4sitell\u00e4 mukautettuja malleja, jotka niputimme lis\u00e4osien kanssa.<\/p>\n<p>Yksi ensimm\u00e4isist\u00e4 kysymyksist\u00e4, joka usein her\u00e4\u00e4 t\u00e4m\u00e4n lausunnon yhteydess\u00e4, on kuitenkin<\/p>\n<blockquote>\n<p>Miksi sis\u00e4llyt\u00e4t mukautettuja malleja laajennukseen?<\/p>\n<\/blockquote>\n<p>Ja ymm\u00e4rr\u00e4n sen jollain tasolla.<\/p>\n<ol>\n<li>Mallien pit\u00e4minen laajennuksessa h\u00e4m\u00e4rt\u00e4\u00e4 hieman teemojen ja laajennusten v\u00e4lisi\u00e4 rajoja varsinkin kun j\u00e4t\u00e4t teemoja esittelyyn ja laajennuksia liiketoimintalogiikkaan,<\/li>\n<li>K\u00e4ytt\u00e4jien pyyt\u00e4minen kopioimaan teematiedostoja paikasta toiseen on huono k\u00e4ytt\u00f6kokemus.<\/li>\n<\/ol>\n<p>Mutta yll\u00e4 oleviin tapauksiin on olemassa joitain vastalauseita tai kenties suoria poikkeuksia.<\/p>\n<h2>WordPress template_redirect -koukku<\/h2>\n<p>Ennen kuin puhun WordPress <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a> -koukusta, haluan puhua hieman edell\u00e4 mainituista kohdista.<\/p>\n<h3>1 Mallit laajennuksissa<\/h3>\n<p>Jos olet rakentamassa mukautettua laajennusta, joka on k\u00e4ytt\u00f6liittym\u00e4 sek\u00e4 WordPressin ett\u00e4 kolmannen osapuolen API:n kanssa tai joka k\u00e4ytt\u00e4\u00e4 jonkin tyyppist\u00e4 tietovarastojen, tehtaiden, mallien ja n\u00e4kymien yhdistelm\u00e4\u00e4, sinun on n\u00e4ytett\u00e4v\u00e4 n\u00e4m\u00e4 tiedot etupuolella. -loppu, ja sen on oltava teemaagnostikko.<\/p>\n<p>T\u00e4m\u00e4 ei tarkoita, ett\u00e4 joku ei voisi tyylitt\u00e4\u00e4 sivun elementtej\u00e4 tai sis\u00e4llytt\u00e4\u00e4 mallia ty\u00f6h\u00f6ns\u00e4, mutta se tarkoittaa, ett\u00e4 laajennuksen tulee tarjota k\u00e4ytt\u00e4j\u00e4lle hahmonnettavia perustietoja.<\/p>\n<h3>2 K\u00e4ytt\u00e4jien pyyt\u00e4minen kopioimaan tiedostoja on v\u00e4\u00e4rin<\/h3>\n<p>Muista slogan, jota Apple mainosti kerran ja usein nimell\u00e4 &quot; <strong><a href=\"http:\/\/macdailynews.com\/2017\/12\/19\/at-tim-cooks-apple-steve-jobs-is-long-gone-and-so-is-the-it-just-works-ethos\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Se vain toimii?<\/a><\/strong> Vaikka se ei ehk\u00e4 olekaan asia, jota he huusivat niin paljon kuin ennen (jos ollenkaan, en\u00e4\u00e4), pid\u00e4n ajatuksesta, ett\u00e4 k\u00e4ytt\u00e4j\u00e4lle on &quot;vain ty\u00f6t\u00e4&quot;, ja se on jotain, johon yrit\u00e4n pyrki\u00e4 ty\u00f6.<\/p>\n<p>Joten kun on kyse mukautettujen mallien tai n\u00e4kymien luomisesta laajennuksille, en halua pyyt\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4\u00e4 kopioimaan tiedostoja. Haluan heid\u00e4n vain:<\/p>\n<ol>\n<li>asenna laajennus,<\/li>\n<li>napsauta aktivoida.<\/li>\n<\/ol>\n<p>Ja siin\u00e4 se. Loput tulee olla joko itsest\u00e4\u00e4n selvi\u00e4 tai hyvin dokumentoituja.<\/p>\n<h2>Takaisin Koukkuun<\/h2>\n<p>Okei, oletetaan hetkeksi, ett\u00e4 olemme rakentaneet laajennuksen, joka sis\u00e4lt\u00e4\u00e4 useita perusmalleja (tai n\u00e4kymi\u00e4 k\u00e4ytt\u00e4m\u00e4st\u00e4si kielest\u00e4 riippuen) ja ett\u00e4 mallit on kirjoitettava aktiivisen teeman hakemiston juureen.<\/p>\n<p>Voit k\u00e4ytt\u00e4\u00e4 <strong><a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">template_redirect<\/a><\/strong> &#8211; koukkua (ja monet suositut laajennukset tekev\u00e4t niin). Voit lukea siit\u00e4 lis\u00e4\u00e4 t\u00e4\u00e4lt\u00e4, mutta sen ydin on seuraava:<\/p>\n<blockquote>\n<p>T\u00e4m\u00e4 toimintokoukku suoritetaan juuri ennen kuin WordPress m\u00e4\u00e4ritt\u00e4\u00e4, mik\u00e4 mallisivu ladataan. Se on hyv\u00e4 koukku k\u00e4ytett\u00e4v\u00e4ksi, jos sinun on teht\u00e4v\u00e4 uudelleenohjaus t\u00e4ysin tiet\u00e4en kyselyn kohteena olevasta sis\u00e4ll\u00f6st\u00e4.<\/p>\n<\/blockquote>\n<p>Ja selvyyden vuoksi, en est\u00e4 t\u00e4m\u00e4n koukun k\u00e4ytt\u00f6\u00e4. Tarjoan vain vaihtoehdon. Ja se on t\u00e4m\u00e4 (kuten sen pit\u00e4isi toimia seuraavasti):<\/p>\n<ol>\n<li>aktivoi plugin,<\/li>\n<li>etsi aktiivinen teema,<\/li>\n<li>Jos niit\u00e4 ei viel\u00e4 ole, kopioi mallitiedostot laajennuksesta aktiivisen teeman juurihakemistoon<\/li>\n<\/ol>\n<p>Viimeinen vaihe on kriittinen, koska jos mallitiedostot ovat olemassa, on t\u00e4rke\u00e4\u00e4, ett\u00e4 niit\u00e4 ei korvata ensisijaisesti siksi, ett\u00e4 k\u00e4ytt\u00e4j\u00e4 olisi voinut kirjoittaa mukautuksensa.<\/p>\n<p>N\u00e4in <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/04887ee3a384f10ce6eac00d52e2dfb8#file-00-copy-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">voit tehd\u00e4 sen yhdell\u00e4 toiminnolla<\/a><\/strong> (t\u00e4ydennettyn\u00e4 kommenteilla, jotka osoittavat, mit\u00e4 k\u00e4yt\u00e4t).<\/p>\n<pre><code>&lt;?php\n\nadd_action('plugins_loaded', __NAMESPACE__. 'acmeCopyTemplates');\n\/**\n * Copies the template files from the `assets\/templates` directory to the root directory \n * of the currently active theme (if they do not already exist).\n *\/\nfunction acmeCopyTemplates()\n{\n    \/\/ Find the currently active theme.\n    $activeThemeDir = get_template_directory();\n\n    \/**\n     * Read all of the template files from assets\/templates into an array but\n     * exclude the '.' and the '..' from the array.\n     *\/\n    $templates = array_slice(scandir(dirname(__FILE__).'\/assets\/templates'), 2);\n\n    \/**\n     * Now copy all of these files to the active theme directory.\n     * If the file already exists, then don't do it.\n     *\/\n    foreach ($templates as $template) {\n        if (!file_exists($destination = trailingslashit($activeThemeDir).$template)) {\n            continue;\n        }\n\n        $source = dirname(__FILE__).'\/assets\/templates\/'.$template;\n        $destination = trailingslashit($activeThemeDir).$template;\n\n        copy($source, $destination);\n    }\n}\n<\/code><\/pre>\n<p>Huomaa, ett\u00e4 t\u00e4m\u00e4 k\u00e4ytt\u00e4\u00e4 useita PHP-toimintoja. Nimitt\u00e4in:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.array-slice.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_slice<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.scandir.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">skandir<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.dirname.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dirname<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.file-exists.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">file_exists<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/php.net\/manual\/en\/function.copy.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kopio<\/a><\/strong><\/li>\n<\/ul>\n<p>Kaikki ne ovat mielest\u00e4ni k\u00e4tevi\u00e4 ja t\u00e4rkeit\u00e4 tiet\u00e4\u00e4 riippumatta luonteesta, jossa k\u00e4yt\u00e4t niit\u00e4.<\/p>\n<h2>Tukevatko is\u00e4nn\u00e4t t\u00e4t\u00e4?<\/h2>\n<p>Jotkut is\u00e4nn\u00e4t tekev\u00e4t. Tied\u00e4n varsinaisesti, ett\u00e4 <strong><a href=\"https:\/\/wpengine.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WPEnginen<\/a><\/strong> kaltaiset is\u00e4nn\u00e4t eiv\u00e4t sit\u00e4 tee, eik\u00e4 t\u00e4m\u00e4k\u00e4\u00e4n ole is\u00e4nt\u00e4kritiikki\u00e4. Jotkut tekev\u00e4t sen turvallisuussyist\u00e4; toiset sallivat sen, mutta se ei tarkoita, ett\u00e4 he ovat v\u00e4hemm\u00e4n turvallisia \u2013 se tarkoittaa vain, ett\u00e4 heid\u00e4n infrastruktuurinsa on m\u00e4\u00e4ritetty eri tavalla.<\/p>\n<p>Viime k\u00e4dess\u00e4 t\u00e4m\u00e4 osoittaa, ett\u00e4 on olemassa muita tapoja saada malleja k\u00e4ytt\u00e4jien saataville, kun laajennusta k\u00e4ytet\u00e4\u00e4n, mutta se ei ole ainoa tapa, eik\u00e4 se v\u00e4ltt\u00e4m\u00e4tt\u00e4 aina toimi.<\/p>\n<p>Vaihtoehdot on kuitenkin hyv\u00e4, varsinkin jos haluat tietyn laajennuksen arkkitehtuurin toisen sijaan.<\/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>Kun tulee luomaan mukautettuja malleja laajennuksille, haluan niiden vain toimivan, ja t\u00e4ss\u00e4 on vaihtoehto WordPressin template_redirect-toiminnolle.<\/p>\n","protected":false},"author":1,"featured_media":236109,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,803,864],"tags":[1166],"class_list":["post-231004","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-php-5","category-wordpress-5","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231004","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=231004"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/231004\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/236109"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=231004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=231004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=231004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}