Byłem zaskoczony, gdy odkryłem, że add_role () modyfikuje bazę danych i kończy się niepowodzeniem, jeśli rola już istnieje. Są tu dwie implikacje, jedna poważniejsza od drugiej: 1) jeśli jesteś w trakcie opracowywania i zaktualizujesz swój kod add_role, musisz najpierw remove_role () 2), gdy masz rację, nigdy nie powinieneś uruchamiać tego kodu jeszcze raz.
Zazwyczaj więc umieszczam moją metodę add_role () w haku akcji wp_loaded. A ponieważ jestem w fazie rozwoju, dodałem także remove_role () przed moją add_role, więc mogę być pewien, że jeśli zmodyfikuję moją listę kapsli, to faktycznie zacznie obowiązywać.
Ale najwyraźniej jest to teraz uruchamiane przy każdym wejściu na stronę bloga. Ok, mógłbym umieścić to w czynności tylko dla administratora, lub utworzyć stronę wtyczki, może w sekcji Użytkownicy lub Narzędzia, gdzie tę rolę można utworzyć raz. Chyba mam nadzieję, że istnieje prostsze, bardziej eleganckie rozwiązanie.
Nie wyobrażam sobie, że istnieje akcja typu run_once?
A może najlepszą praktyką jest dodanie roli, a następnie użycie add_cap () kilka razy? I nawet wtedy wyobrażam sobie, że add_cap ma dostęp do bazy danych.
Po prostu myślę o najlepszym sposobie ograniczenia niepotrzebnego dostępu do bazy danych. Jakie są twoje najlepsze praktyki?
źródło
remove_role()
funkcja dodawania wcześniejadd_role()
mi pomogła.Odpowiedzi:
Role użytkowników i możliwości są zapisywane w bazie danych, więc kiedy już użyjesz
add_role()
jej zapisanej, a następnie następnego ładowania, WordPress pozna tę rolę, podobnie jak wbudowane role.Teraz, jeśli spojrzysz na funkcję
add_role()
bardziej konkretnie w linii 141 , zobaczysz, że zapisuje ona rolę i możliwości w bazie danych tylko wtedy, gdy var$use_db
jest ustawiony na true (którym jest domyślnie), więc możesz po prostu zmienić go przed wywołaniemadd_role()
funkcja, a rola nie zostanie zapisana.próbować:
Aktualizacja:
Jeśli jest w środowisku testowym / programistycznym, nie widzę żadnych wad, ale jeśli jesteś w środowisku na żywo, oszczędzasz czas potrzebny do utworzenia tego na roli przy każdym obciążeniu.
Jeśli chodzi o najlepszą praktykę, uruchom raz, jeśli we wtyczce powinieneś użyć,
register_activation_hook
a do wszystkiego innego używam prostej niestandardowej funkcji warunkowej:źródło
run_once
zwiększa zbyt wiele operacji odczytu / zapisu bazy danych przy każdym ładowaniu strony. Proszę nie używać tego.