{"id":230346,"date":"2022-12-10T14:45:00","date_gmt":"2022-12-10T11:45:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230346"},"modified":"2022-12-07T12:07:41","modified_gmt":"2022-12-07T09:07:41","slug":"alternatywa-dla-wordpress-template_redirect-hook","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/alternatywa-dla-wordpress-template_redirect-hook\/","title":{"rendered":"Alternatywa dla WordPress template_redirect Hook"},"content":{"rendered":"\n<p>Wi\u0119kszo\u015b\u0107 pracy, kt\u00f3r\u0105 teraz wykonuj\u0119, skupia si\u0119 na niestandardowych wtyczkach lub narz\u0119dziach, kt\u00f3re dzia\u0142aj\u0105 na WordPressie.<\/p>\n<p>Je\u015bli mia\u0142by\u015b konceptualizowa\u0107, ile z tworzonych przeze mnie projekt\u00f3w jest po\u0142\u0105czonych, sprawdzi\u0142by\u015b WordPressa (i wszystko, co si\u0119 z nim wi\u0105\u017ce) jako podstaw\u0119, a nast\u0119pnie kod ma warstw\u0119, kt\u00f3ra komunikuje si\u0119 z WordPressem i kt\u00f3ra mo\u017ce si\u0119 komunikowa\u0107 za pomoc\u0105 zewn\u0119trznych interfejs\u00f3w API.<\/p>\n<p>Jednak gdy to robi\u0119, cz\u0119sto pojawia si\u0119 komponent front-endowy, kt\u00f3ry wymaga renderowania informacji do szablon\u00f3w. Chocia\u017c tworzenie szablon\u00f3w dla WordPressa nie jest z natury trudne (chocia\u017c \u017ca\u0142uj\u0119, \u017ce nie mamy czego\u015b wi\u0119cej ni\u017c tylko tagi szablon\u00f3w \u2013 takie jak silnik szablon\u00f3w, to kolejny post), my\u015bl\u0119, \u017ce warto przyjrze\u0107 si\u0119 kilku sposobom obs\u0142ugi niestandardowych szablony, kt\u00f3re do\u0142\u0105czyli\u015bmy do wtyczek.<\/p>\n<p>Jedno z pierwszych pyta\u0144, kt\u00f3re cz\u0119sto pojawia si\u0119 w tym o\u015bwiadczeniu, brzmi:<\/p>\n<blockquote>\n<p>Dlaczego mia\u0142by\u015b umieszcza\u0107 niestandardowe szablony we wtyczce?<\/p>\n<\/blockquote>\n<p>I rozumiem to na pewnych poziomach.<\/p>\n<ol>\n<li>Trzymanie szablon\u00f3w we wtyczce nieco zaciera granice mi\u0119dzy motywami a wtyczkami, zw\u0142aszcza gdy zostawiasz motywy do prezentacji i wtyczki do logiki biznesowej,<\/li>\n<li>Proszenie u\u017cytkownik\u00f3w o kopiowanie plik\u00f3w motyw\u00f3w z jednej lokalizacji do drugiej jest z\u0142ym do\u015bwiadczeniem u\u017cytkownika.<\/li>\n<\/ol>\n<p>Ale jest kilka kontrowersji, a mo\u017ce wr\u0119cz wyj\u0105tk\u00f3w od powy\u017cszych przypadk\u00f3w.<\/p>\n<h2>WordPress szablon_przekierowanie Hook<\/h2>\n<p>Zanim opowiem o haczyku <a href=\"https:\/\/codex.wordpress.org\/Plugin_API\/Action_Reference\/template_redirect\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">szablonu_przekierowania<\/a> WordPress, chc\u0119 porozmawia\u0107 o punktach wymienionych powy\u017cej.<\/p>\n<h3>1 Szablony we wtyczkach<\/h3>\n<p>Je\u015bli tworzysz niestandardow\u0105 wtyczk\u0119, kt\u00f3ra wsp\u00f3\u0142pracuje zar\u00f3wno z WordPress, jak i zewn\u0119trznym API lub kt\u00f3ra wykorzystuje kombinacj\u0119 repozytori\u00f3w, fabryk, modeli i widok\u00f3w, b\u0119dziesz musia\u0142 wy\u015bwietli\u0107 te informacje z przodu -koniec i musi by\u0107 niezale\u017cny od motywu.<\/p>\n<p>Nie oznacza to, \u017ce kto\u015b nie mo\u017ce wystylizowa\u0107 element\u00f3w na stronie ani uwzgl\u0119dni\u0107 szablonu w swojej pracy, ale oznacza to, \u017ce wtyczka powinna zapewnia\u0107 podstawowy poziom informacji, kt\u00f3re s\u0105 renderowane dla u\u017cytkownika.<\/p>\n<h3>2 Proszenie u\u017cytkownik\u00f3w o kopiowanie plik\u00f3w jest z\u0142e<\/h3>\n<p>Pami\u0119tacie has\u0142o, kt\u00f3re Apple kiedy\u015b i cz\u0119sto reklamowa\u0142o jako \u201e <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\">To po prostu dzia\u0142a?<\/a><\/strong> \u201e Nawet je\u015bli nie jest to co\u015b, co wylewaj\u0105 tak cz\u0119sto, jak kiedy\u015b (je\u015bli w og\u00f3le, to ju\u017c), podoba mi si\u0119 pomys\u0142, aby \u201epo prostu pracowa\u0107&quot; dla u\u017cytkownika i jest to co\u015b, do czego staram si\u0119 d\u0105\u017cy\u0107 w moim praca.<\/p>\n<p>Wi\u0119c je\u015bli chodzi o tworzenie niestandardowych szablon\u00f3w lub widok\u00f3w dla wtyczek, nie chc\u0119 prosi\u0107 u\u017cytkownika o kopiowanie plik\u00f3w. Chc\u0119 tylko, \u017ceby:<\/p>\n<ol>\n<li>zainstaluj wtyczk\u0119,<\/li>\n<li>kliknij aktywuj.<\/li>\n<\/ol>\n<p>I to wszystko. Reszta powinna by\u0107 oczywista lub dobrze udokumentowana.<\/p>\n<h2>Powr\u00f3t do haka<\/h2>\n<p>Ok, wi\u0119c za\u0142\u00f3\u017cmy na chwil\u0119, \u017ce zbudowali\u015bmy wtyczk\u0119, kt\u00f3ra zawiera kilka podstawowych szablon\u00f3w (lub widok\u00f3w w zale\u017cno\u015bci od u\u017cywanego \u017cargonu) i \u017ce szablony musz\u0105 by\u0107 zapisane w g\u0142\u00f3wnym katalogu aktywnego motywu.<\/p>\n<p>Mo\u017cesz u\u017cy\u0107 haka <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> (i robi to wiele popularnych wtyczek). Wi\u0119cej na ten temat mo\u017cesz przeczyta\u0107 tutaj, ale sedno tego jest nast\u0119puj\u0105ce:<\/p>\n<blockquote>\n<p>Ten hak akcji jest wykonywany tu\u017c przed tym, jak WordPress okre\u015bli, kt\u00f3r\u0105 stron\u0119 szablonu ma za\u0142adowa\u0107. Jest to dobry haczyk do u\u017cycia, je\u015bli chcesz wykona\u0107 przekierowanie z pe\u0142n\u0105 wiedz\u0105 o tre\u015bci, o kt\u00f3r\u0105 pytano.<\/p>\n<\/blockquote>\n<p>I \u017ceby by\u0142o jasne, nie odradzam u\u017cywania tego haka. Po prostu proponuj\u0119 alternatyw\u0119. I to jest to (bo powinno dzia\u0142a\u0107 nast\u0119puj\u0105co):<\/p>\n<ol>\n<li>aktywowa\u0107 wtyczk\u0119,<\/li>\n<li>zlokalizuj aktywny motyw,<\/li>\n<li>je\u015bli jeszcze nie istniej\u0105, skopiuj pliki szablon\u00f3w z wtyczki do katalogu g\u0142\u00f3wnego aktywnego motywu<\/li>\n<\/ol>\n<p>Ostatni krok jest krytyczny, poniewa\u017c je\u015bli pliki szablon\u00f3w istniej\u0105, wa\u017cne jest, aby ich nie zast\u0119powa\u0107 g\u0142\u00f3wnie dlatego, \u017ce u\u017cytkownik m\u00f3g\u0142 napisa\u0107 ich dostosowania.<\/p>\n<p>Maj\u0105c to na uwadze, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/04887ee3a384f10ce6eac00d52e2dfb8#file-00-copy-templates-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oto jak mo\u017cesz to zrobi\u0107 w jednej funkcji<\/a><\/strong> (wraz z komentarzami, aby pokaza\u0107, czego u\u017cywasz).<\/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>Zauwa\u017c, \u017ce u\u017cywa to kilku funkcji PHP. Mianowicie:<\/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\">plik istnieje<\/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\">Kopiuj<\/a><\/strong><\/li>\n<\/ul>\n<p>My\u015bl\u0119, \u017ce wszystkie z nich s\u0105 przydatne i wa\u017cne, aby wiedzie\u0107, niezale\u017cnie od charakteru, w jakim ich u\u017cywasz.<\/p>\n<h2>Czy gospodarze to obs\u0142uguj\u0105?<\/h2>\n<p>Niekt\u00f3rzy gospodarze to robi\u0105. Wiem na pewno, \u017ce hosty takie jak <strong><a href=\"https:\/\/wpengine.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WPEngine<\/a><\/strong> tego nie robi\u0105 i nie jest to r\u00f3wnie\u017c krytyka hosta. Niekt\u00f3rzy robi\u0105 to ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa; inni na to pozwalaj\u0105, ale to nie znaczy, \u017ce s\u0105 mniej bezpieczne \u2013 oznacza to po prostu, \u017ce maj\u0105 inaczej skonfigurowan\u0105 infrastruktur\u0119.<\/p>\n<p>Ostatecznie pokazuje to, \u017ce istniej\u0105 inne sposoby udost\u0119pniania szablon\u00f3w u\u017cytkownikom, gdy u\u017cywana jest wtyczka, ale nie jest to jedyny spos\u00f3b i mo\u017ce nie zawsze dzia\u0142a\u0107.<\/p>\n<p>Posiadanie opcji jest jednak dobre, zw\u0142aszcza je\u015bli wolisz okre\u015blon\u0105 architektur\u0119 we wtyczce od innej.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je\u015bli chodzi o tworzenie niestandardowych szablon\u00f3w dla wtyczek, chc\u0119, aby po prostu dzia\u0142a\u0142y, a oto alternatywa dla funkcji WordPress template_redirect.<\/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":[721,897,805,866],"tags":[1169],"class_list":["post-230346","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-php-7","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230346","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=230346"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/230346\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/236109"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=230346"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=230346"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=230346"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}