add_role () uruchomić tylko raz?

11

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?

Tom Auger
źródło
Niesamowite! Dzięki za to pytanie. Tylko remove_role()funkcja dodawania wcześniej add_role()mi pomogła.
beytarovski

Odpowiedzi:

10

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_dbjest ustawiony na true (którym jest domyślnie), więc możesz po prostu zmienić go przed wywołaniem add_role()funkcja, a rola nie zostanie zapisana.

próbować:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

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_hooka do wszystkiego innego używam prostej niestandardowej funkcji warunkowej:

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}
Bainternet
źródło
O cholera. Wiedziałem o tym nawet z niektórych wcześniejszych rootowań na temat klasy WP_Roles. Czy potrafisz wymyślić jakiś minus NIEUŻYWANIA bazy danych do ról? I czy istnieje najlepsza praktyka WP do robienia czegoś tylko raz?
Tom Auger,
Dzięki za aktualizację - podoba mi się prostota rozwiązania update_option
Tom Auger
Niezbyt satysfakcjonujące, ale wydaje się to najlepszym rozwiązaniem 👍
Blackbam
Ta funkcja run_oncezwiększa zbyt wiele operacji odczytu / zapisu bazy danych przy każdym ładowaniu strony. Proszę nie używać tego.
Mayank Dudakiya