{"id":229946,"date":"2022-11-30T17:00:00","date_gmt":"2022-11-30T14:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229946"},"modified":"2022-11-09T19:24:49","modified_gmt":"2022-11-09T16:24:49","slug":"niestandardowe-reguly-przepisywania-i-szablony-stron-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/niestandardowe-reguly-przepisywania-i-szablony-stron-w-wordpress\/","title":{"rendered":"Niestandardowe regu\u0142y przepisywania i szablony stron w WordPress"},"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> jest solidnym interfejsem API, zak\u0142adaj\u0105c, \u017ce znasz si\u0119 na wyra\u017ceniach regularnych.<\/p>\n<p>I szczerze m\u00f3wi\u0105c, nawet je\u015bli nie, narz\u0119dzia takie jak <strong><a href=\"https:\/\/www.phpliveregex.com\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP Live RegEx<\/a><\/strong> bardzo u\u0142atwiaj\u0105 testowanie kodu przed umieszczeniem go w <code>add_rewrite_rule<\/code>wywo\u0142aniu API.<\/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=\"Niestandardowe regu\u0142y przepisywania i szablony stron w WordPress\" ><\/a><\/p>\n<p>Jednak zdarzaj\u0105 si\u0119 sytuacje, w kt\u00f3rych mo\u017cesz znale\u017a\u0107 si\u0119 w sytuacji, w kt\u00f3rej b\u0119dziesz musia\u0142 pracowa\u0107 z regu\u0142ami przepisywania i szablonami stron. A kiedy tak jest, nie zawsze jest to tak proste, jak wykonanie prostego wywo\u0142ania za pomoc\u0105 pojedynczego wyra\u017cenia regularnego.<\/p>\n<p>Pow\u00f3d? Je\u015bli masz wiele stron korzystaj\u0105cych z tego samego szablonu, nie zawsze b\u0119dziesz mie\u0107 stron\u0119 w tym samym indeksie w zapytaniu uruchamianym na ka\u017cdej stronie.<\/p>\n<p>W tym celu musimy sobie z tym poradzi\u0107 w nieco inny spos\u00f3b ni\u017c, powiedzmy, po prostu dost\u0119p do liczbowego indeksu informacji w zapytaniu globalnym.<\/p>\n<h2>Przepisz regu\u0142y i szablony stron<\/h2>\n<p>Najpierw za\u0142\u00f3\u017cmy, \u017ce mamy dwa szablony (kt\u00f3re nie s\u0105 w okre\u015blonej kolejno\u015bci):<\/p>\n<ol>\n<li>szablon-alpha.php<\/li>\n<li>szablon-beta.php<\/li>\n<\/ol>\n<p>A potem za\u0142\u00f3\u017cmy, \u017ce chcemy ustawi\u0107 niestandardowy URL dla stron, z kt\u00f3rych ka\u017cda korzysta z jednego z tych szablon\u00f3w.<\/p>\n<p>Podzia\u0142a\u0142oby to na nast\u0119puj\u0105ce kroki:<\/p>\n<ol>\n<li>Przejrzyj posty w zapytaniu,<\/li>\n<li>Przechowuj post za pomoc\u0105 szablonu w odpowiedniej tablicy,<\/li>\n<li>Skonfiguruj regu\u0142y przepisywania dla ka\u017cdego posta zawieraj\u0105cego dane zapytanie.<\/li>\n<\/ol>\n<p>W tym przyk\u0142adzie zachowam do\u015b\u0107 proste zasady przepisywania. W ko\u0144cu wyra\u017cenia regularne mog\u0105 by\u0107 wystarczaj\u0105co trudne do na\u015bladowania, wi\u0119c pr\u00f3ba pod\u0105\u017cania za nimi podczas pracy z obiektem Query, wieloma tablicami i obs\u0142ug\u0105 regu\u0142 mo\u017ce by\u0107 troch\u0119 za du\u017co.<\/p>\n<p>Maj\u0105c to na uwadze, oto przyk\u0142adowy kod, kt\u00f3ry jest podzielony na podstawie powy\u017cszych krok\u00f3w. Na ko\u0144cu posta udost\u0119pni\u0119 fragment, kt\u00f3ry \u0142\u0105czy wszystko w kilka oddzielnych funkcji, dzi\u0119ki czemu mo\u017cesz zobaczy\u0107, jak to wszystko do siebie pasuje.<\/p>\n<p>Maj\u0105c to na uwadze, oto jak poradzi\u0107 sobie z wszystkimi powy\u017cszymi.<\/p>\n<h3>1 Dodawanie regu\u0142 przepisywania<\/h3>\n<p>Najpierw musimy przeczyta\u0107 kilka informacji z globalnego obiektu zapytania WordPress, aby znale\u017a\u0107 wszystkie strony, do kt\u00f3rych zastosowano szablony.<\/p>\n<p>W tym celu mo\u017cemy wczyta\u0107 informacje <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-00-read-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z globalnego obiektu zapytania do zmiennej lokalnej<\/a><\/strong>. U\u0142atwia to omini\u0119cie reszty kodu, je\u015bli nie ma z czym pracowa\u0107.<\/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 Przechowuj istotne informacje w tablicy<\/h3>\n<p>Zak\u0142adaj\u0105c, \u017ce istniej\u0105 strony maj\u0105ce szablony, b\u0119dziemy kontynuowa\u0107 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-001-store-templated-pages-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">przechowywanie ka\u017cdej ze stron<\/a><\/strong> w tablicach, aby\u015bmy mogli \u0142atwo zarz\u0105dza\u0107 ich odpowiednimi regu\u0142ami przepisywania.<\/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>Zauwa\u017c, \u017ce powy\u017cej odwo\u0142uj\u0119 si\u0119 do tablicy globalnej. Za\u0142\u00f3\u017cmy, \u017ce jest to po prostu inicjowane jako pusta tablica w konstruktorze klasy.<\/p>\n<h3>3 Skonfiguruj zasady przepisywania<\/h3>\n<p>Teraz, gdy mamy dwie tablice \u2013 po jednej dla ka\u017cdego szablonu i stron, kt\u00f3re go zawieraj\u0105 \u2013 mo\u017cemy je iterowa\u0107 i przypisa\u0107 regu\u0142y przepisywania dla ka\u017cdej z tych stron.<\/p>\n<p>Za\u0142\u00f3\u017cmy na przyk\u0142ad, \u017ce dla jednego szablonu, powiedzmy alfa, chcemy ustawi\u0107 regu\u0142y przepisywania dla Stan\u00f3w Zjednoczonych i stan\u00f3w.<\/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\">Oto kod<\/a><\/strong> dla<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>A <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-03-acme-id-rules-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">oto kod<\/a><\/strong> dla <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>Oczywi\u015bcie wyra\u017cenia regularne u\u017cyte w powy\u017cszym kodzie s\u0142u\u017c\u0105 jedynie do cel\u00f3w demonstracyjnych. Twoje b\u0119dzie na wszystko, co jest potrzebne do twojego projektu.<\/p>\n<h3>4 Teraz wszyscy razem<\/h3>\n<p>Wa\u017cne jest, aby podzieli\u0107 wszystkie te funkcje na w\u0142asne metody, aby w razie potrzeby mo\u017cna je by\u0142o \u0142atwo hermetyzowa\u0107 i przetestowa\u0107.<\/p>\n<p>W tym celu, oto jak b\u0119dzie wygl\u0105da\u0142 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/d80f687b25281f1ab7c9390cf56d2187#file-04-final-functions-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pe\u0142ny kod :<\/a><\/strong><\/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>Pami\u0119taj jednak; jest to oparte tylko na kodzie demonstracyjnym udost\u0119pnionym w tym po\u015bcie. Podczas pracy nad projektem wyra\u017cenia regularne, szablony itd. b\u0119d\u0105 si\u0119 r\u00f3\u017cni\u0107.<\/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>S\u0105 chwile, w kt\u00f3rych mo\u017cesz znale\u017a\u0107 si\u0119 w sytuacji, w kt\u00f3rej b\u0119dziesz musia\u0142 pracowa\u0107 z przepisywaniem regu\u0142 i szablon\u00f3w stron.<\/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":[721,897,845,866],"tags":[1169],"class_list":["post-229946","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229946","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=229946"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/229946\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/163544"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=229946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=229946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=229946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}