Czy powinniśmy ufać globalnym postom?

21

@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.

$postna 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 $postnie jest to wiarygodne. Każdy źle napisany fragment kodu korzystający z niestandardowego zapytania może zmienić $postglobalny, 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 $postjest tak zawodny? Czy powinniśmy $postw 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_querya następnie użycie jej metod, coś w rodzaju $wp_query->post.

Wszelkie uwagi na ten temat będą mile widziane.

Pieter Goosen
źródło
Zresetowanie posta kopiuje zmienną do innej, możesz nazwać to milion razy w swoim kodzie i nie zaobserwować żadnego spadku wydajności, więc nie wiem, co jest w tym złego.
Milo,

Odpowiedzi:

16

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 $postjest 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 $postjest to poprawna WP_Postinstancja:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

Sprawdzam to również w rzadkich przypadkach, do których uzyskuję $postbezpośredni dostęp .

Pomyśl, że get_queried_object()zwraca nieoczekiwaną wartość, jeśli jakiś kod używa query_posts, ale hej, jeśli ktoś używa kodu, który polega na query_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:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

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 :)

gmazzap
źródło