{"id":230410,"date":"2022-12-10T14:38:00","date_gmt":"2022-12-10T11:38:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230410"},"modified":"2022-12-07T12:07:43","modified_gmt":"2022-12-07T09:07:43","slug":"ett-alternativ-till-wordpress-template_redirect-hook","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/ett-alternativ-till-wordpress-template_redirect-hook\/","title":{"rendered":"Ett alternativ till WordPress template_redirect Hook"},"content":{"rendered":"\n<p>Majoriteten av det arbete jag g\u00f6r just nu fokuserar p\u00e5 anpassade plugins eller verktyg som fungerar ovanp\u00e5 WordPress.<\/p>\n<p>Om du skulle f\u00f6rest\u00e4lla dig hur m\u00e5nga av projekten som jag bygger \u00e4r sammansatta, skulle du granska WordPress (och allt vad det inneb\u00e4r) som grund, och d\u00e5 har koden ett lager som kommunicerar med WordPress, och som kan kommunicera med API:er fr\u00e5n tredje part.<\/p>\n<p>N\u00e4r du g\u00f6r detta, men det finns ofta en front-end-komponent som kr\u00e4ver att jag \u00e5terger information till mallar. \u00c4ven om det inte \u00e4r sv\u00e5rt att bygga mallar f\u00f6r WordPress (\u00e4ven om jag \u00f6nskar att vi hade lite mer \u00e4n malltaggar \u2013 till exempel en mallmotor, det \u00e4r ett annat inl\u00e4gg), tycker jag att det \u00e4r v\u00e4rt att titta p\u00e5 ett par s\u00e4tt som vi kan hantera anpassade mallar som vi buntade med plugins.<\/p>\n<p>En av de f\u00f6rsta fr\u00e5gorna som ofta st\u00e4lls med detta uttalande \u00e4r dock<\/p>\n<blockquote>\n<p>Varf\u00f6r skulle du inkludera anpassade mallar i ett plugin?<\/p>\n<\/blockquote>\n<p>Och jag f\u00e5r det p\u00e5 vissa niv\u00e5er.<\/p>\n<ol>\n<li>Att beh\u00e5lla mallar i ett plugin suddar ut gr\u00e4nserna lite mellan teman och plugins, s\u00e4rskilt n\u00e4r du l\u00e4mnar teman f\u00f6r presentation och plugins f\u00f6r aff\u00e4rslogik,<\/li>\n<li>Att be anv\u00e4ndare att kopiera temafiler fr\u00e5n en plats till en annan \u00e4r d\u00e5lig anv\u00e4ndarupplevelse.<\/li>\n<\/ol>\n<p>Men det finns n\u00e5gra motbevisningar eller kanske direkta undantag fr\u00e5n ovanst\u00e5ende fall.<\/p>\n<h2>WordPress template_redirect Hook<\/h2>\n<p>Innan jag pratar om 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> &#8211; kroken vill jag prata lite om punkterna som n\u00e4mns ovan.<\/p>\n<h3>1 Mallar i plugins<\/h3>\n<p>Om du bygger ett anpassat plugin som gr\u00e4nssnitt b\u00e5de med WordPress och ett tredjeparts-API eller som anv\u00e4nder n\u00e5gon typ av kombination av arkiv, fabriker, modeller och vyer, m\u00e5ste du visa denna information p\u00e5 framsidan -slut, och det m\u00e5ste vara temaagnostiskt.<\/p>\n<p>Detta betyder inte att n\u00e5gon inte kan utforma elementen p\u00e5 sidan eller inkludera mallen i sitt arbete, men det betyder att plugin-programmet ska ge en grundl\u00e4ggande niv\u00e5 av information som \u00e5terges till anv\u00e4ndaren.<\/p>\n<h3>2 Att be anv\u00e4ndare att kopiera filer \u00e4r d\u00e5ligt<\/h3>\n<p>Kommer du ih\u00e5g sloganen som Apple en g\u00e5ng och ofta utropade som &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\">Det fungerar bara?<\/a><\/strong> &quot; \u00c4ven om det kanske inte \u00e4r n\u00e5got de sprutar ut lika mycket som de en g\u00e5ng gjorde (om alls l\u00e4ngre), s\u00e5 gillar jag tanken p\u00e5 att &quot;bara jobba&quot; f\u00f6r anv\u00e4ndaren, och det \u00e4r n\u00e5got som jag f\u00f6rs\u00f6ker str\u00e4va efter i min arbete.<\/p>\n<p>S\u00e5 n\u00e4r det kommer till att skapa anpassade mallar eller vyer f\u00f6r plugins vill jag inte be anv\u00e4ndaren att beh\u00f6va kopiera filer. Jag vill bara att de ska:<\/p>\n<ol>\n<li>installera plugin,<\/li>\n<li>klicka p\u00e5 aktivera.<\/li>\n<\/ol>\n<p>Och det \u00e4r allt. Resten ska vara antingen sj\u00e4lvklart eller v\u00e4ldokumenterat.<\/p>\n<h2>Tillbaka till Hook<\/h2>\n<p>Okej s\u00e5 l\u00e5t oss f\u00f6r ett \u00f6gonblick anta att vi har byggt en plugin, plugin inneh\u00e5ller flera grundl\u00e4ggande mallar (eller vyer beroende p\u00e5 spr\u00e5ket du anv\u00e4nder) och att mallarna m\u00e5ste skrivas till roten av det aktiva temats katalog.<\/p>\n<p>Du kan anv\u00e4nda <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> kroken (och m\u00e5nga popul\u00e4ra plugins g\u00f6r det). Du kan l\u00e4sa mer om det h\u00e4r, men k\u00e4rnan i det \u00e4r som f\u00f6ljer:<\/p>\n<blockquote>\n<p>Denna \u00e5tg\u00e4rdshook k\u00f6rs precis innan WordPress best\u00e4mmer vilken mallsida som ska laddas. Det \u00e4r en bra krok att anv\u00e4nda om du beh\u00f6ver g\u00f6ra en omdirigering med full k\u00e4nnedom om inneh\u00e5llet som har efterfr\u00e5gats.<\/p>\n<\/blockquote>\n<p>Och f\u00f6r att vara tydlig, jag avr\u00e5der inte anv\u00e4ndningen av denna krok. Jag erbjuder bara ett alternativ. Och det \u00e4r detta (som det ska fungera enligt f\u00f6ljande):<\/p>\n<ol>\n<li>aktivera plugin,<\/li>\n<li>hitta det aktiva temat,<\/li>\n<li>om de inte redan finns, kopiera mallfilerna fr\u00e5n plugin-programmet till det aktiva temats rotkatalog<\/li>\n<\/ol>\n<p>Det sista steget \u00e4r avg\u00f6rande eftersom om mallfilerna existerar \u00e4r det viktigt att inte skriva \u00f6ver dem, fr\u00e4mst eftersom anv\u00e4ndaren kunde ha skrivit sina anpassningar.<\/p>\n<p>Med det sagt, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/04887ee3a384f10ce6eac00d52e2dfb8#file-00-copy-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r kan du g\u00f6ra det i en enda funktion<\/a><\/strong> (komplett med kommentarer f\u00f6r att visa vad du anv\u00e4nder).<\/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>Observera att detta anv\u00e4nder flera PHP-funktioner. N\u00e4mligen:<\/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\">scandir<\/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\">fil existerar<\/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\">kopiera<\/a><\/strong><\/li>\n<\/ul>\n<p>Alla som jag tycker \u00e4r praktiska och viktiga att k\u00e4nna till oavsett i vilken natur du anv\u00e4nder dem.<\/p>\n<h2>St\u00f6der v\u00e4rdar detta?<\/h2>\n<p>Vissa v\u00e4rdar g\u00f6r det. Jag vet att v\u00e4rdar som <strong><a href=\"https:\/\/wpengine.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WPEngine<\/a><\/strong> inte g\u00f6r det och det h\u00e4r \u00e4r inte heller en kritik av v\u00e4rden. Vissa g\u00f6r det av s\u00e4kerhetssk\u00e4l; andra till\u00e5ter det men det betyder inte att de \u00e4r mindre s\u00e4kra \u2013 det betyder bara att de har sin infrastruktur inst\u00e4lld p\u00e5 ett annat s\u00e4tt.<\/p>\n<p>I slut\u00e4ndan visar detta att det finns andra s\u00e4tt att g\u00f6ra mallar tillg\u00e4ngliga f\u00f6r anv\u00e4ndare n\u00e4r ett plugin anv\u00e4nds, men det \u00e4r inte det enda s\u00e4ttet, och det kanske inte alltid fungerar.<\/p>\n<p>Att ha alternativ \u00e4r dock bra, s\u00e4rskilt om du f\u00f6redrar en specifik arkitektur i ditt plugin framf\u00f6r en annan.<\/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>N\u00e4r det g\u00e4ller att skapa anpassade mallar f\u00f6r plugins vill jag att de bara ska fungera och h\u00e4r \u00e4r ett alternativ till WordPress template_redirect-funktionen.<\/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":[901,807,724,868],"tags":[1173],"class_list":["post-230410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-koda","category-php-9","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230410","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=230410"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230410\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/236109"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}