Kiedy dzwonię switch_to_blog()
z identyfikatorem bloga, nie wiem, czy ten blog rzeczywiście istnieje. Funkcja zawsze zwraca TRUE
.
Przypadek testowy:
switch_to_blog( PHP_INT_MAX );
$post = get_post( 1 );
restore_current_blog();
Spowoduje to błędy bazy danych, które zostaną ujawnione użytkownikowi. Jak mogę temu zapobiec?
Przypadek użycia w świecie rzeczywistym
Byłem głównym programistą Multilingual Press . Gdy użytkownik tłumaczy post, dostaje taki ekran:
Teraz mogą się zdarzyć:
- Zapisuje post z powodzeniem i kontynuuje jego tłumaczenie.
- Inny użytkownik, administrator sieci, usuwa niemiecki blog podczas pisania.
- Uderza ponownie zapisz i dostaje błędy bazy danych.
Chcę uniknąć tego scenariusza. Jak mogę szybko sprawdzić, czy blog docelowy istnieje? Dzwonię switch_to_blog()
bardzo często w wielu różnych klasach, więc musi być szybko.
$wpdb->blogid;
na hakwp_insert_post_data
?get_post()
to tylko czytanie. Pomiędzy ostatnim zapisaniem a ponownym załadowaniem ekranu edycji może być długa przerwa.SELECT blog_id FROM {$wpdb->blogs} WHERE site_id = %d AND public = '1' AND archived = '0' AND spam = '0' AND deleted = '0'
wp_cache_switch_to_blog()
, ale pomaga tylko przy trwałej pamięci podręcznej, a nie domyślnej stronie WP. W każdym razie, dla mnie nie jest do końca jasne, gdzie chcesz sprawdzić istnienie bloga: Kiedy ktoś usuwa blog lub gdy ktoś próbuje napisać przetłumaczony post wskazujący na innego bloga (zasilający tę samą treść w innym języku)?Odpowiedzi:
Pomysł @ GM na buforowanie czeku doprowadził mnie do następującej funkcji pomocnika. Umieściłem go w globalnej przestrzeni nazw, aby był dostępny wszędzie.
Ta funkcja nie mówi nic o stanie bloga, tylko jeśli istnieje i nie jest oznaczona jako usunięta. Zapytanie do bazy danych jest bardzo szybkie (0,0001 sekundy) i uruchamia tylko jedno zapytanie na identyfikator witryny, bez względu na to, jak często funkcja jest wywoływana.
Stosowanie
źródło
$wpdb->get_results
+wp_list_pluck
zamiast tylko(int) $wpdb->get_var
? jednak +1 i myślę, że coś podobnego powinno być w rdzeniu switch_to_blog ...get_var()
zwraca tylko jeden wynik. Użyłemget_col()
teraz i upewniłem się, że pusty wynik nie zostanie ponownie pobrany.