Po każdym wystąpieniu switch_to_blog()
należy zadzwonić, restore_current_blog()
aby przywrócić bieżący (faktycznie poprzedni) blog.
Ale jeśli przeglądasz dwa lub więcej blogów i wywołujesz switch_to_blog()
każdy z nich, czy istnieje jakiś powód, aby nie używać dodatkowego switch_to_blog()
na końcu pętli, aby przełączyć się na oryginalny blog, zamiast dzwonić restore_current_blog()
przy każdym przejściu.
Na przykład
Dlaczego nie:
$original_blog_id = get_current_blog_id();
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
}
switch_to_blog( $original_blog_id );
zamiast:
foreach( $blog_ids as $blog_id ){
switch_to_blog( $blog_id );
//Do stuff
restore_current_blog_id();
}
Odpowiedzi:
Po każdej instancji
switch_to_blog()
ciebie trzeba nazwaćrestore_current_blog()
inaczej WP będzie sądzić, że jest w trybie A „włączane” i potencjalnie mogą powrócić nieprawidłowe dane.Jeśli zobaczysz kod źródłowy dla obu funkcji, zobaczysz, że te funkcje push / pop data w globalnej nazwie
$GLOBALS['_wp_switched_stack']
. Jeśli nie zadzwoniszrestore_current_blog()
po każdymswitch_to_blog()
,$GLOBALS['_wp_switched_stack']
będzie pusty. Jeśli$GLOBALS['_wp_switched_stack']
niepuste WP uważa, że jest w trybie przełączonym, nawet jeśli wróciłeś do oryginalnego bloga przy użyciuswitch_to_blog()
. Funkcja trybu przełączanego działams_is_switched()
i ma wpływwp_upload_dir()
. Jeśliwp_upload_dir()
myśli, że jest w trybie komutacji, może zwrócić niepoprawne dane.wp_upload_dir()
buduje adresy URL witryny, więc jest to bardzo ważna funkcja.To jest prawidłowe użycie:
źródło
wp_upload_dir()
wykorzystuje się do generowania adresów URL, ale uwierzę ci, że to naprawdę powoduje błędy w działaniu. W każdym razie istnienie środkówms_is_switched()
oznacza, że moje alternatywne podejście powoduje, że funkcja nie zachowuje się zgodnie z oczekiwaniami i może uszkodzić wtyczki oraz rdzeń. Dziękirestore_current_blog()
wymaga aktualizacji, ponieważ mówi, że w przypadku wielu przełączników wystarczy zapisać bieżący,$blog_id
a następnie użyć wieluswitch_to_blog()
połączeń.Jeśli chcesz uruchomić wiele blogów, nie musisz za każdym razem przywracać poprzedniego bloga. Jedyne, co rośnie, to
$GLOBALS['_wp_switched_stack']
tablica z identyfikatorami blogów, nie ma się czym martwić.Pamiętaj jednak,
restore_current_blog()
że nie będzie już działać (!!!) Po drugim przełączeniu, ponieważ korzysta z poprzedniego bloga - który wtedy nie jest pierwszym blogiem. Zapisz więc pierwszy identyfikator bloga i zadzwoń…… Zamiast
restore_current_blog()
kiedy skończysz. Zmienne globalne muszą zostać zresetowane, w przeciwnym razie napotkasz problemy wymienione przez @ user42826.Wpływ na wydajność jest ogromny. Przeprowadziłem kilka testów na lokalnej instalacji z 12 witrynami:
Wynik:
Używanie
restore_current_blog()
po każdym przełączniku podwaja czas potrzebny tylko na przełączenie.źródło
restore_current_blog()
po prostu nie pobrał poprzedniego identyfikatora bloga i wywołaniaswitch_to_blog()
- krótkie spojrzenie na źródło kodu i wygląda na to, że jest trochę duplikacji kodu ...switch_to_blog()
jest bardzo ograniczonym (zepsutym) interfejsem API. Jeśli kiedykolwiek WordPress poprawek , które mamy byłaby nasz kod tak. A WordPress nigdy nie porzuci swoich ukochanych globali.I don't think modifying the globals directly is a good idea
, nie mów tego twórcom wp core;)Dzięki odpowiedzi @toscho. To żądanie w kolejce WP - zobacz aktualizacje tutaj . Do czasu, gdy zostanie to naprawione w WP, jeśli ktoś desperacko chce użyć standardu
restore_current_blog()
, oto inna metoda (popraw, jeśli się mylę):wykonaj swoją funkcję, tj
i wykonaj tylko raz po zakończeniu wielu przełączników. (więcej: wp-obejmuje / ms-blogs.php )
źródło