@toscho skomentował tę odpowiedź, co skłoniło mnie do ponownego przemyślenia. Ile zaufania powinniśmy mieć w skali globalnej, szczególnie w odniesieniu do post globali, takich jak $post
?
Więc co? Zmienna globalna może zostać nadpisana przez wszystkich przed uruchomieniem testu. To jest punkt zmiennych globalnych: globalny dostęp.
$post
na przykład jest z pewnością jednym z globałów, które są w większości modyfikowane w samym motywie lub za pomocą wtyczek. Jest to jednak globalny najczęściej używany w innych aplikacjach w ramach danego szablonu, na przykład do konfigurowania powiązanych postów.
Z odpowiadania (i komentowania) na kilka postów z konkretnymi problemami spowodowanymi użyciem niestandardowych zapytań , naprawdę wyróżnia się to, że większość problemów jest spowodowana brakiem resetowania niestandardowych zapytań (niestandardowe zapytania zmieniają globalne ustawienia określone przez główne zapytanie).
Z tego wynika, że $post
nie jest to wiarygodne. Każdy źle napisany fragment kodu korzystający z niestandardowego zapytania może zmienić $post
globalny, co z kolei coś zepsuje (np. Powiązane posty).
Tylko garstka programistów WordPress ma wystarczającą wiedzę na temat wewnętrznego działania rdzenia i wie, czego unikać, a czego nie. Większa populacja użytkowników nie ma pojęcia, jak działa rdzeń WordPress.
Po prostu pobierają motyw i instalują wtyczki, aby zrobić to, co jest potrzebne, a nawet po prostu kopiują kod z samouczka. Powiedzmy, że instalują źle napisaną wtyczkę, która psuje powiązane posty w jednym poście, skąd będą wiedzieć, co to spowodowało? Czy będą w stanie to rozwiązać samodzielnie, czy będzie setną osobą piszącą do autora tematu e-maila na temat tego problemu lub zamieszczającą pytanie na tej stronie?
Moje pytanie: w jaki sposób możesz zabezpieczyć się przed takimi problemami spowodowanymi przez inny importowany kod, gdy taki globalny $post
jest tak zawodny? Czy powinniśmy $post
w ogóle używać globalnego ? Jakie są alternatywy?
Po prostu podzielę się tutaj swoimi myślami, zanim zakończę: pomyślałem (i widziałem również w niektórych motywach i wtyczkach) albo używam wp_reset_postdata()
albo wp_reset_query()
przed użyciem $post
, aby upewnić się, że globalny jest resetowany do głównego zapytania $post
. Ale dlaczego mam zawyżać kod w moim motywie, ponieważ ktoś inny nie kodował poprawnie jego wtyczki? A jeśli ktoś poprawnie zresetował niestandardowe zapytanie, operacja ta jest uruchamiana niepotrzebnie po raz drugi, co nie jest dobre.
Druga metoda, o której myślałem, to wykorzystanie, $wp_query
a następnie użycie jej metod, coś w rodzaju $wp_query->post
.
Wszelkie uwagi na ten temat będą mile widziane.
Odpowiedzi:
Jest smutna prawda: nigdy nie możesz być pewien, że jakiś kod nie złamie twojego kodu, i nic nie możesz zrobić, aby temu zapobiec. Zwłaszcza w WordPress, gdzie wszystko jest globalne.
Powiedział, że tak, globalny
$post
jest jednym z najczęściej używanych globalnej var, więc stosując specjalną opiekę na to może być dobry pomysł.W moim kodzie rzadko uzyskuję bezpośredni dostęp do globalnego
$post
.Podczas pojedynczego konkursu używam
get_queried_object()
i zwykle sprawdzam, czy$post
jest to poprawnaWP_Post
instancja:Sprawdzam to również w rzadkich przypadkach, do których uzyskuję
$post
bezpośredni dostęp .Pomyśl, że
get_queried_object()
zwraca nieoczekiwaną wartość, jeśli jakiś kod używaquery_posts
, ale hej, jeśli ktoś używa kodu, który polega naquery_posts
, zasługuje na to, jeśli jego strona się zepsuje :)Ponadto, jeśli oczekuję pewnych warunków, sprawdzam je, np. Konkretne typy postów lub określony status.
Jeśli potrzebuję więcej kontroli i w większej liczbie miejsc, tworzę funkcję do ich wykonania:
Wewnątrz zapytania niestandardowego, podczas zapętlania, wywołanie
the_post()
resetuje obiekt post, więc powinno być dobrze. Następnie mam obowiązek zadzwonićwp_reset_postdata()
po niestandardowym zapytaniu i robię to oczywiście :)źródło