{"id":233770,"date":"2023-02-21T13:30:00","date_gmt":"2023-02-21T10:30:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233770"},"modified":"2022-11-11T12:18:08","modified_gmt":"2022-11-11T09:18:08","slug":"samouczek-niestandardowe-punkty-koncowe-adresu-url-z-api-rewrite-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/samouczek-niestandardowe-punkty-koncowe-adresu-url-z-api-rewrite-wordpress\/","title":{"rendered":"Samouczek: Niestandardowe punkty ko\u0144cowe adresu URL z API Rewrite WordPress"},"content":{"rendered":"\n<p>Czy chcia\u0142e\u015b kiedy\u015b rozszerzy\u0107 pojedyncze posty, strony lub niestandardowe typy post\u00f3w za pomoc\u0105 niestandardowego szablonu, kt\u00f3ry zachowuje w\u0142asn\u0105 struktur\u0119 adres\u00f3w URL? Z WordPress <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Rewrite API<\/a> jest to w pe\u0142ni mo\u017cliwe i wcale nie jest trudne.<\/p>\n<p>W tym samouczku przyjrzymy si\u0119, jak do\u0142\u0105czy\u0107 pojedynczy niestandardowy widok typu posta do innego slugu, kt\u00f3ry \u0142aduje inny szablon. Innymi s\u0142owy, je\u015bli pojedynczy post typu niestandardowego posta ma adres URL \u201eexample.com\/miejsce docelowe\/wenecja\/&quot;, mo\u017cesz doda\u0107 regu\u0142y adresu URL dla oddzielnych stron z powi\u0105zanymi informacjami dla ka\u017cdego miejsca docelowego, na przyk\u0142ad&#8221;example.com\/miejsce docelowe\/wenecja \/aktywno\u015bci\/&#8221; i \u201eexample.com\/destination\/wenecja\/atrakcje\/&#8221;.<\/p>\n<p>Je\u015bli interesuje Ci\u0119, jak doda\u0107 punkty ko\u0144cowe do strony \u201eMoje konto&#8221; WooCommerce, mam <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\">kolejny post<\/a> w\u0142a\u015bnie o tym!<\/p>\n<p>WordPress Rewrite API ma wiele przydatnych funkcji do pisania w\u0142asnych niestandardowych regu\u0142 URL. By\u0107 mo\u017ce widzia\u0142e\u015b najbardziej znan\u0105 i szerok\u0105 funkcj\u0119; <code>add_rewrite_rule()<\/code>. Ten samouczek u\u017cywa jednak podobnego <code>add_rewrite_endpoint()<\/code>, co jest bardzo przydatne przy dodawaniu \u201epunkt\u00f3w ko\u0144cowych&#8221; URL (w zasadzie dodawanie niestandardowych slug URL po czym\u015b, co ju\u017c istnieje, np. po zako\u0144czeniu pojedynczego postu lub pojedynczej kategorii). Mo\u017cesz osi\u0105gn\u0105\u0107 ten sam wynik, u\u017cywaj\u0105c, <code>add_rewrite_rule()<\/code>ale proces dodawania punkt\u00f3w ko\u0144cowych jest prostszy.<\/p>\n<h2>Co zrobimy<\/h2>\n<p>W tym przewodniku za\u0142o\u017cymy, \u017ce stworzyli\u015bmy dwa niestandardowe typy post\u00f3w; \u201efilm&#8221; i \u201eaktor&#8221;. Regu\u0142a bezpo\u015bredniego linku dla pojedynczego filmu to \u201eexample.com\/movie\/walk-club\/&#8221;, a dla pojedynczego aktora \u201eexample.com\/actor\/brad-pitt\/&#8221;. Chcemy oddzielnej strony dla ka\u017cdego filmu, kt\u00f3ra pokazuje wszystkich aktor\u00f3w w tym filmie, znajduj\u0105c\u0105 si\u0119 w \u201eexample.com\/movie\/fight-club\/actors\/&#8221; i podobnie osobn\u0105 stron\u0119 dla ka\u017cdego aktora, kt\u00f3ra pokazuje wszystkie filmy, w kt\u00f3rych gra\u0142 aktor, znajduje si\u0119 pod adresem \u201eexample.com\/actor\/brad-pitt\/movies\/&#8221;.<\/p>\n<p>Nie b\u0119d\u0119 wchodzi\u0107 w szczeg\u00f3\u0142y, jak doda\u0107 te dwa niestandardowe typy post\u00f3w; je\u015bli potrzebujesz pomocy w wykonaniu tej cz\u0119\u015bci, polecam przeczytanie mojego posta o <a href=\"https:\/\/awhitepixel.com\/blog\/how-to-create-custom-post-types-and-custom-taxonomies\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">dodawaniu niestandardowych typ\u00f3w post\u00f3w<\/a>.<\/p>\n<h2>Pisanie kodu<\/h2>\n<p>Pierwszym krokiem jest wywo\u0142anie <code>add_rewrite_endpoint()<\/code>funkcji podpi\u0119tej do <code>init<\/code>(generalnie wszystkie funkcje w Rewrite API s\u0105 podpi\u0119te do <code>init<\/code>). zarejestrowa\u0107 nasze dwa po\u017c\u0105dane punkty ko\u0144cowe; \u201efilmy&#8221; i \u201eaktorzy&#8221;. Funkcja przyjmuje dwa argumenty <a href=\"https:\/\/codex.wordpress.org\/Rewrite_API\/add_rewrite_endpoint\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">;<\/a> po pierwsze \u017c\u0105dany punkt ko\u0144cowy (np. \u201efilmy&#8221;), a po drugie sta\u0142\u0105 okre\u015blaj\u0105c\u0105, gdzie punkt ko\u0144cowy powinien \u201e\u017cy\u0107&#8221; (np. strony, autor, archiwa itp.). Sprawd\u017a w dokumentacji, dla kt\u00f3rych sta\u0142ych mo\u017cesz u\u017cy\u0107; co do tego przyk\u0142adu genera\u0142 <code>EP_PERMALINK<\/code>jest w porz\u0105dku:<\/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>Uwaga: je\u015bli niestandardowy typ wpisu jest hierarchiczny, co oznacza, \u017ce \u200b\u200bzawiera <code>'hierarchical' =&gt; true<\/code>, <code>register_post_type()<\/code>musisz zmieni\u0107 sta\u0142\u0105 <code>EP_PERMALINK<\/code>za pomoc\u0105 <code>EP_PAGES<\/code>.<\/p>\n<p>Po zapisaniu tego kodu musisz przej\u015b\u0107 do Ustawienia&gt; Permalinki i po prostu klikn\u0105\u0107 przycisk Zapisz, aby od\u015bwie\u017cy\u0107 permalinki. Za ka\u017cdym razem, gdy dodajesz lub modyfikujesz regu\u0142\u0119 przepisywania, musisz od\u015bwie\u017cy\u0107 swoje permalinki, aby dzia\u0142a\u0142a!<\/p>\n<h3>Obs\u0142uga zapytania vars<\/h3>\n<p>Jako tw\u00f3rca motyw\u00f3w lub wtyczek mo\u017cesz dowiedzie\u0107 si\u0119, czy wy\u015bwietla\u0107 szablony dla tych punkt\u00f3w ko\u0144cowych, sprawdzaj\u0105c \u201ezmienne zapyta\u0144&#8221;; w zasadzie globalny obiekt zapytania WordPressa. Robimy to, wywo\u0142uj\u0105c <code>get_query_var()<\/code>zapytanie z argumentem (\u201efilmy&#8221; lub \u201eaktorzy&#8221;).<\/p>\n<p>Je\u015bli pracowa\u0142e\u015b z <code>add_rewrite_rule()<\/code>lub <code>get_query_var()<\/code>wcze\u015bniej, by\u0107 mo\u017ce ju\u017c wiesz, \u017ce WordPress nie dodaje automatycznie niestandardowych zmiennych zapyta\u0144. Zwykle musisz filtrowa\u0107 <code>query_vars<\/code>i dodawa\u0107 niestandardowe zmienne, aby WordPress je wype\u0142ni\u0142. Jednak <code>add_rewrite_endpoint()<\/code>automatycznie robi to za nas.<\/p>\n<p>Je\u015bli jednak spr\u00f3bujemy to wywo\u0142a\u0107 <code>get_query_var('movies')<\/code>, nigdy nie b\u0119dzie wygl\u0105da\u0142o na ustawione. Dzieje si\u0119 tak, poniewa\u017c zak\u0142ada, \u017ce \u200b\u200bmusi mie\u0107 warto\u015b\u0107, aby mo\u017cna by\u0142o j\u0105 ustawi\u0107. Regu\u0142y punkt\u00f3w ko\u0144cowych zak\u0142adaj\u0105, \u017ce wszystko, co nast\u0119puje po punkcie ko\u0144cowym, jest warto\u015bci\u0105. Na przyk\u0142ad \u201eexample.com\/aktor\/brad-pitt\/filmy\/jaka\u015b-warto\u015b\u0107\/&#8221; b\u0119dzie dzia\u0142a\u0107, poniewa\u017c na tej stronie <code>get_query_var('movies')<\/code>zwr\u00f3ci warto\u015b\u0107 \u201ejaka\u015b-warto\u015b\u0107&#8221;. Ale to nie jest to, czego chcemy, chcemy, aby dzia\u0142a\u0142o tylko z pojedynczym punktem ko\u0144cowym. Aby rozwi\u0105za\u0107 ten problem, musimy pod\u0142\u0105czy\u0107 si\u0119 do <code>request<\/code>filtra WordPressa i poinformowa\u0107 WordPressa, \u017ce \u200b\u200bje\u015bli jeste\u015bmy na naszych punktach ko\u0144cowych, zmienne zapytania powinny doda\u0107 punkt ko\u0144cowy z pewn\u0105 warto\u015bci\u0105 (po prostu ustawiamy j\u0105 na <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>Je\u015bli spr\u00f3bujesz teraz u\u017cy\u0107 <code>get_query_vars('movies')<\/code>when w \u201eexample.com\/actor\/brad-pitt\/movies\/&#8221;, otrzymasz warto\u015b\u0107 <code>true<\/code>(wa\u017cne jest to, \u017ce faktycznie zosta\u0142a ustawiona).<\/p>\n<h3>\u0141adowanie szablonu<\/h3>\n<p>Nast\u0119pnym krokiem jest podj\u0119cie decyzji, co powinno si\u0119 wydarzy\u0107 w tych dw\u00f3ch punktach ko\u0144cowych; lub innymi s\u0142owy, kt\u00f3re szablony chcesz za\u0142adowa\u0107. Ta cz\u0119\u015b\u0107 zale\u017cy od Ciebie, mo\u017cesz si\u0119 do niej przyczepi\u0107 <code>template_redirect<\/code>, ale jest to naprawd\u0119 zalecane tylko wtedy, gdy chcesz wykona\u0107 faktyczne przekierowanie. Polecam podpi\u0105\u0107 si\u0119 pod <code>template_include<\/code>filtr i po prostu powiedzie\u0107 WordPressowi, jakich szablon\u00f3w u\u017cy\u0107, gdy jeste\u015bmy w naszych niestandardowych punktach ko\u0144cowych. Za\u0142\u00f3\u017cmy, \u017ce motyw ma szablony PHP <code>single-actor-movies.php<\/code>dla \u201eexample.com\/actor\/\/movies\/ i <code>single-movie-actors.php<\/code>dla \u201eexample.com\/movie\/\/actors\/&#8221;.<\/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>Z tym filtrem WordPress powinien za\u0142adowa\u0107 dostarczone szablony dla naszych niestandardowych punkt\u00f3w ko\u0144cowych, a w ramach tych szablon\u00f3w <code>$post<\/code>obiekt globalny by\u0142by powi\u0105zanym pojedynczym obiektem postu przed punktem ko\u0144cowym \u2013 np. obiekt postu pojedynczego aktora, gdy jeste\u015bmy w szablonie do wy\u015bwietlania wszystkich filmy, w kt\u00f3rych aktor wyst\u0105pi\u0142. U\u0142atwia nam to wyszukiwanie informacji, kt\u00f3re chcemy pokaza\u0107.<\/p>\n<h2>Pobieranie adresu URL do punktu ko\u0144cowego<\/h2>\n<p>Posiadanie naszych niestandardowych punkt\u00f3w ko\u0144cowych i stron jest w porz\u0105dku i elegancki, ale gdzie\u015b trzeba by do nich linkowa\u0107. Na przyk\u0142ad w szablonie pojedynczego filmu chcia\u0142by\u015b mie\u0107 link \u201eZobacz wszystkich aktor\u00f3w&#8221;, kt\u00f3ry prowadzi do twojego punktu ko\u0144cowego.<\/p>\n<p>Niestety nie ma do tego tak prostej funkcji WordPress. Musisz samodzielnie zbudowa\u0107 adres URL. Polecam u\u017cywa\u0107 <code>[get_site_url](https:\/\/developer.wordpress.org\/reference\/functions\/get_site_url\/)()<\/code>dla punkt\u00f3w ko\u0144cowych ca\u0142ej witryny lub w powy\u017cszym przypadku odwo\u0142ujesz si\u0119 do konkretnego posta <code>[get_the_permalink](https:\/\/developer.wordpress.org\/reference\/functions\/get_the_permalink\/)()<\/code>(wewn\u0105trz p\u0119tli lub podaj\u0105c identyfikator posta) i do\u0142\u0105czasz punkt ko\u0144cowy po nim, na przyk\u0142ad:<\/p>\n<pre><code>echo get_the_permalink(). '\/actors';<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ten samouczek pokazuje, jak rozszerzy\u0107 niestandardowy typ postu o niestandardowy szablon, kt\u00f3ry zachowuje w\u0142asn\u0105 struktur\u0119 adresu URL, za pomoc\u0105 interfejsu API WordPress Rewrite.<\/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":[897,721,721,897,1110,836,836,845,845,866,866],"tags":[1169],"class_list":{"0":"post-233770","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-kod","8":"category-deweloper","11":"category-n-a","12":"category-przewodnik-dla-poczatkujacych","14":"category-samouczki","16":"category-wordpress-7","18":"tag-affiai-pl"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233770","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=233770"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/233770\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/152349"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=233770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=233770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=233770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}