Po kliknięciu pojedynczego wpisu na stronie kategorii lub w tym przypadku na dowolnej stronie, możesz uzyskać adres URL odnośnika i przeanalizować go, aby uzyskać ciąg zapytania. Ale działa to tylko z domyślną strukturą permalink
Przykład, gdy strona odsyłająca jest stroną kategorii:
A var_dump( parse_url( wp_get_referer() ) );
daje następujące dane wyjściowe z domyślną strukturą bezpośredniego połączenia
array(4) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(11) "/wordpress/"
["query"]=>
string(5) "cat=7"
}
Przy tym samym var_dump()
ustawieniu permalinków na /%postname%/
to, otrzymujesz
array(3) {
["scheme"]=>
string(4) "http"
["host"]=>
string(9) "localhost"
["path"]=>
string(32) "/wordpress/category/uit-my-lewe/"
}
Mogę użyć path
z drugiego bloku kodu z get_category_by_path()
, mogę uzyskać obiekty kategorii
Mój problem polega na tym, jak mam to zrobić dla warunków taksonomicznych.
Zrobiłem test. Mam niestandardową taksonomię event_cat
. Jeśli przepiszę to event-slug
, otrzymam następujące, path
używając /%postname%/
struktury permalink
/wordpress/event-slug/5-star/
i
event_cat=5-star
przy użyciu domyślnej struktury
Automatycznie moja nazwa taksonomii nie będzie w adresie URL, tylko ślimak mojego terminu. Tak więc nie będzie to bardzo bezpieczna metoda pobierania obiektów z tego terminu.
Moje pytanie brzmi: jak prawidłowo uzyskać domyślną strukturę permalink, uzyskać ciąg zapytania, ciąg zapytania lub nazwę systematyki i terminu ze /%postname%/
struktury permalink
źródło
Odpowiedzi:
Po pierwsze muszę powiedzieć, że
wp_get_referer()
nie jest w 100% wiarygodny, ponieważ polega na$_SERVER['HTTP_REFERER']
tym, że nie jest w 100% wiarygodny, z dokumentacji php.net :Alternatywne rozwiązanie
Jeśli możesz dodać do adresu URL argument zapytania, który mówi, skąd pochodzi post, będzie on bardziej niezawodny i nie będziesz musiał analizować adresu URL, aby uzyskać obiekt terminu.
Przykład:
W ten sposób bezpośrednie linki kliknięte na stronie kategorii wyślą cię do adresu URL podobnego do
Możesz łatwo zrozumieć, skąd pochodzi użytkownik, nie polegając na
$_SERVER['HTTP_REFERER']
żadnym innym wysiłku i bez niego.Odpowiedz na pytanie
Pobieranie informacji o zapytaniach zaczynając od adresu URL jest czymś, co WordPress robi wewnątrz
WP::parse_request()
metody.Ta metoda jest przeznaczona do użycia tylko raz i tylko dla „głównego” adresu URL (adresu URL, który przegląda użytkownik), a nie dla dowolnych adresów URL.
Kilka miesięcy temu napisałem wtyczkę Url To Query, aby zrobić to samo dla dowolnych adresów URL.
To, co zrobiłem, to wziąć i przekształcić go
WP::parse_request()
w bardziej rozsądny kod OOP i sprawić, by działał z dowolnymi adresami URL (np. Adres URL do przetworzenia jest odbierany jako argument zamiast zamiast z$_SERVER
var).Za pomocą mojej wtyczki możesz
Otrzymujesz więc argumenty zapytania (coś, co możesz bezpośrednio przekazać
new WP_Query
), zaczynając od adresu URL, czyli dokładnie to, coWP::parse_request()
robi.W twoim przypadku prawdopodobnie możesz sprawdzić tablicę args bez potrzeby uruchamiania zapytania.
To z pewnością może działać, jednak uważam, że dodatkowy wysiłek potrzebny do przeanalizowania adresu URL i niewiarygodności
$_SERVER['HTTP_REFERER']
sprawia, że pierwsze rozwiązanie jest lepsze dla twoich zakresów.źródło
Pierwotnym zamiarem tego pytania było wiedzieć, skąd skierowano pojedynczy post, a następnie zgodnie z tym, obsłużyć kolejne i poprzednie posty zgodnie z polecającym post.
Chciałem na przykład:
Kliknięcie posta następuje na stronie kategorii, taksonomii, tagu, wyszukiwania lub archiwum autora. Te archiwa służą jako strony odsyłające. Teraz normalnie można by użyć, tak jak w moim pytaniu,
wp_get_referer()
aby uzyskać odnośnika i użyć go w dalszych zapytaniach. Jak opisano przez @GM w jego zaakceptowanej odpowiedzi powyżej , ta metoda nie jest niezawodna, więc skorzystałem z jego alternatywnego rozwiązania .Innym problemem było użycie jakiegoś pliku cookie lub sesji do przechowywania tego odsyłacza, aby nadal wyświetlać posty od oryginalnego odsyłacza, gdy odsuwasz się od oryginalnego pojedynczego wpisu, który został kliknięty w określonym archiwum. Ponieważ pliki cookie są również kontrolowane przez użytkownika końcowego, a zatem nie są wiarygodne, a fakt, że WordPress domyślnie nie używa sesji, zmieniłem linki do następnego i poprzedniego postu za pomocą @GM Alternative Solution, aby mieć niezawodny sposób sprawdzania i przechowywania mojej oryginalnej polecający.
Właśnie to wymyśliłem i mam nadzieję, że ktoś okaże się przydatny w najbliższej przyszłości. Używaj i nadużywaj kodu, aby dopasować go do swoich potrzeb, tylko jedna prośba: zostaw link z powrotem do tego pytania. :-)
UWAGI DOTYCZĄCE KODU OBSERWUJĄCEGO
Ten kod jest dość długi i intensywny, więc nie będę wchodził w szczegóły. Kod został dobrze skomentowany
Ten kod ma opcję stronicowania między postami w tym samym terminie, podobnie jak domyślny
next_post_link()
iprevious_post_link()
działa w WordPress. Podobnie jak funkcje natywne, musisz ustawić taksonomię. Domyślna wartośćin_same_term
to,true
a taksonomia tocategory
Co najważniejsze, ten kod wymaga PHP 5.4+
KOD
WYKORZYSTANIE W JEDNYM SZABLONIE
Jeśli nie musisz poruszać się po postach w tym samym terminie, uzyskiwać posty ze wszystkich typów postów i dostosowywać następny i poprzedni tekst za pomocą linku, możesz wykonać następujące czynności:
EDYCJA 1
Na żądanie od posta na SO oraz w ramach a
@todo
, wprowadziłem obsługę nie tylko nawigacji między postami z bieżącego typu posta, ale z tablicy typów postów ustawionych przez użytkownika za pomocąpost_types
parametru w funkcji. Zobacz zaktualizowany kod.EDYCJA 2
Dodaj
'suppress_filters' => true,
doWP_Query
argumentów, aby podział na strony nie był zmieniany przez żadne filtry użyte w ciąguWP_Query
źródło