Czy chciałeś kiedyś rozszerzyć pojedyncze posty, strony lub niestandardowe typy postów za pomocą niestandardowego szablonu, który zachowuje własną strukturę adresów URL? Z WordPress Rewrite API jest to w pełni możliwe i wcale nie jest trudne.
W tym samouczku przyjrzymy się, jak dołączyć pojedynczy niestandardowy widok typu posta do innego slugu, który ładuje inny szablon. Innymi słowy, jeśli pojedynczy post typu niestandardowego posta ma adres URL „example.com/miejsce docelowe/wenecja/", możesz dodać reguły adresu URL dla oddzielnych stron z powiązanymi informacjami dla każdego miejsca docelowego, na przykład”example.com/miejsce docelowe/wenecja /aktywności/” i „example.com/destination/wenecja/atrakcje/”.
Jeśli interesuje Cię, jak dodać punkty końcowe do strony „Moje konto” WooCommerce, mam kolejny post właśnie o tym!
WordPress Rewrite API ma wiele przydatnych funkcji do pisania własnych niestandardowych reguł URL. Być może widziałeś najbardziej znaną i szeroką funkcję; add_rewrite_rule(). Ten samouczek używa jednak podobnego add_rewrite_endpoint(), co jest bardzo przydatne przy dodawaniu „punktów końcowych” URL (w zasadzie dodawanie niestandardowych slug URL po czymś, co już istnieje, np. po zakończeniu pojedynczego postu lub pojedynczej kategorii). Możesz osiągnąć ten sam wynik, używając, add_rewrite_rule()ale proces dodawania punktów końcowych jest prostszy.
Co zrobimy
W tym przewodniku założymy, że stworzyliśmy dwa niestandardowe typy postów; „film” i „aktor”. Reguła bezpośredniego linku dla pojedynczego filmu to „example.com/movie/walk-club/”, a dla pojedynczego aktora „example.com/actor/brad-pitt/”. Chcemy oddzielnej strony dla każdego filmu, która pokazuje wszystkich aktorów w tym filmie, znajdującą się w „example.com/movie/fight-club/actors/” i podobnie osobną stronę dla każdego aktora, która pokazuje wszystkie filmy, w których grał aktor, znajduje się pod adresem „example.com/actor/brad-pitt/movies/”.
Nie będę wchodzić w szczegóły, jak dodać te dwa niestandardowe typy postów; jeśli potrzebujesz pomocy w wykonaniu tej części, polecam przeczytanie mojego posta o dodawaniu niestandardowych typów postów.
Pisanie kodu
Pierwszym krokiem jest wywołanie add_rewrite_endpoint()funkcji podpiętej do init(generalnie wszystkie funkcje w Rewrite API są podpięte do init). zarejestrować nasze dwa pożądane punkty końcowe; „filmy” i „aktorzy”. Funkcja przyjmuje dwa argumenty ; po pierwsze żądany punkt końcowy (np. „filmy”), a po drugie stałą określającą, gdzie punkt końcowy powinien „żyć” (np. strony, autor, archiwa itp.). Sprawdź w dokumentacji, dla których stałych możesz użyć; co do tego przykładu generał EP_PERMALINKjest w porządku:
add_action('init', function() {
add_rewrite_endpoint('movies', EP_PERMALINK);
add_rewrite_endpoint('actors', EP_PERMALINK);
});
Uwaga: jeśli niestandardowy typ wpisu jest hierarchiczny, co oznacza, że zawiera 'hierarchical' => true, register_post_type()musisz zmienić stałą EP_PERMALINKza pomocą EP_PAGES.
Po zapisaniu tego kodu musisz przejść do Ustawienia> Permalinki i po prostu kliknąć przycisk Zapisz, aby odświeżyć permalinki. Za każdym razem, gdy dodajesz lub modyfikujesz regułę przepisywania, musisz odświeżyć swoje permalinki, aby działała!
Obsługa zapytania vars
Jako twórca motywów lub wtyczek możesz dowiedzieć się, czy wyświetlać szablony dla tych punktów końcowych, sprawdzając „zmienne zapytań”; w zasadzie globalny obiekt zapytania WordPressa. Robimy to, wywołując get_query_var()zapytanie z argumentem („filmy” lub „aktorzy”).
Jeśli pracowałeś z add_rewrite_rule()lub get_query_var()wcześniej, być może już wiesz, że WordPress nie dodaje automatycznie niestandardowych zmiennych zapytań. Zwykle musisz filtrować query_varsi dodawać niestandardowe zmienne, aby WordPress je wypełnił. Jednak add_rewrite_endpoint()automatycznie robi to za nas.
Jeśli jednak spróbujemy to wywołać get_query_var('movies'), nigdy nie będzie wyglądało na ustawione. Dzieje się tak, ponieważ zakłada, że musi mieć wartość, aby można było ją ustawić. Reguły punktów końcowych zakładają, że wszystko, co następuje po punkcie końcowym, jest wartością. Na przykład „example.com/aktor/brad-pitt/filmy/jakaś-wartość/” będzie działać, ponieważ na tej stronie get_query_var('movies')zwróci wartość „jakaś-wartość”. Ale to nie jest to, czego chcemy, chcemy, aby działało tylko z pojedynczym punktem końcowym. Aby rozwiązać ten problem, musimy podłączyć się do requestfiltra WordPressa i poinformować WordPressa, że jeśli jesteśmy na naszych punktach końcowych, zmienne zapytania powinny dodać punkt końcowy z pewną wartością (po prostu ustawiamy ją na true).
add_filter('request', function($vars) {
if (isset($vars['movies'])) {
$vars['movies'] = true;
}
if (isset($vars['actors'])) {
$vars['actors'] = true;
}
return $vars;
});
Jeśli spróbujesz teraz użyć get_query_vars('movies')when w „example.com/actor/brad-pitt/movies/”, otrzymasz wartość true(ważne jest to, że faktycznie została ustawiona).
Ładowanie szablonu
Następnym krokiem jest podjęcie decyzji, co powinno się wydarzyć w tych dwóch punktach końcowych; lub innymi słowy, które szablony chcesz załadować. Ta część zależy od Ciebie, możesz się do niej przyczepić template_redirect, ale jest to naprawdę zalecane tylko wtedy, gdy chcesz wykonać faktyczne przekierowanie. Polecam podpiąć się pod template_includefiltr i po prostu powiedzieć WordPressowi, jakich szablonów użyć, gdy jesteśmy w naszych niestandardowych punktach końcowych. Załóżmy, że motyw ma szablony PHP single-actor-movies.phpdla „example.com/actor//movies/ i single-movie-actors.phpdla „example.com/movie//actors/”.
add_filter('template_include', function($template) {
if (is_singular() && get_query_var('movies')) {
$post = get_queried_object();
return locate_template(['single-actor-movies.php']);
}
if (is_singular() && get_query_var('actors')) {
$post = get_queried_object();
return locate_template(['single-movie-actors.php']);
}
return $template;
});
Z tym filtrem WordPress powinien załadować dostarczone szablony dla naszych niestandardowych punktów końcowych, a w ramach tych szablonów $postobiekt globalny byłby powiązanym pojedynczym obiektem postu przed punktem końcowym – np. obiekt postu pojedynczego aktora, gdy jesteśmy w szablonie do wyświetlania wszystkich filmy, w których aktor wystąpił. Ułatwia nam to wyszukiwanie informacji, które chcemy pokazać.
Pobieranie adresu URL do punktu końcowego
Posiadanie naszych niestandardowych punktów końcowych i stron jest w porządku i elegancki, ale gdzieś trzeba by do nich linkować. Na przykład w szablonie pojedynczego filmu chciałbyś mieć link „Zobacz wszystkich aktorów”, który prowadzi do twojego punktu końcowego.
Niestety nie ma do tego tak prostej funkcji WordPress. Musisz samodzielnie zbudować adres URL. Polecam używać [get_site_url](https://developer.wordpress.org/reference/functions/get_site_url/)()dla punktów końcowych całej witryny lub w powyższym przypadku odwołujesz się do konkretnego posta [get_the_permalink](https://developer.wordpress.org/reference/functions/get_the_permalink/)()(wewnątrz pętli lub podając identyfikator posta) i dołączasz punkt końcowy po nim, na przykład:
echo get_the_permalink(). '/actors';