add_role () nur einmal ausführen?


11

Ich war überrascht festzustellen, dass add_role () die Datenbank ändert und fehlschlägt, wenn die Rolle bereits vorhanden ist. Hier gibt es zwei Implikationen, eine ist schwerwiegender als die andere: 1) Wenn Sie sich in der Entwicklung befinden und Ihren add_role-Code aktualisieren, müssen Sie zuerst remove_role (). 2) Sobald Sie es richtig haben, sollten Sie diesen Code niemals ausführen müssen nochmal.

Normalerweise habe ich meine add_role () in einen wp_loaded-Aktions-Hook eingefügt. Und da ich gerade in der Entwicklung bin, habe ich auch eine remove_role () vor meiner add_role hinzugefügt, damit ich sicher sein kann, dass meine Liste der Großbuchstaben wirksam wird, wenn ich sie ändere.

Dies wird jetzt jedoch jedes Mal ausgeführt, wenn auf eine Seite des Blogs zugegriffen wird. Okay, ich könnte es in eine Nur-Administrator-Aktion einfügen, oder ich könnte eine Plug-In-Seite unter Benutzer oder Tools erstellen, auf der diese Rolle einmal erstellt werden kann. Ich hoffe, es gibt eine einfachere und elegantere Lösung.

Ich kann mir nicht vorstellen, dass es eine Art von Run_once-Aktion gibt.

Oder ist es die beste Vorgehensweise, einfach die Rolle hinzuzufügen und dann mehrmals add_cap () zu verwenden? Und selbst dann stelle ich mir vor, dass add_cap auf die Datenbank zugreift.

Ich denke nur an den besten Weg, um unnötigen Datenbankzugriff zu reduzieren. Was sind Ihre Best Practices?


Genial! Vielen Dank für diese Frage. Das Hinzufügen von remove_role()Funktionen add_role()hat mir bereits geholfen.
Beytarovski

Antworten:


10

Die Benutzerrollen und -funktionen werden in der Datenbank gespeichert, sodass add_role()WordPress diese Rolle genau wie die eingebauten Rollen kennt, sobald Sie sie verwendet und beim nächsten Laden wieder geladen haben.

Wenn Sie sich die Funktion in Zeile 141add_role() genauer ansehen, werden Sie feststellen, dass sie nur dann die Rolle und die Funktionen in der Datenbank speichert, wenn die Variable auf true gesetzt ist (was standardmäßig der Fall ist), sodass Sie sie einfach ändern können, bevor Sie Ihre aufrufen Funktion und die Rolle werden nicht gespeichert.$use_dbadd_role()

Versuchen:

//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 );

Aktualisieren:

Wenn es sich in einer Test- / Entwicklungsumgebung befindet, sehe ich keinen Nachteil, aber wenn Sie sich in einer Live-Umgebung befinden, sparen Sie die Zeit, die erforderlich ist, um diese Funktion bei jedem Laden zu erstellen.

Was das einmalige Ausführen von Best Practices angeht, wenn Sie in einem Plugin register_activation_hooketwas anderes verwenden sollten, verwende ich eine einfache benutzerdefinierte bedingte Funktion:

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
}

Oh verdammt. Das wusste ich auch aus früheren Veröffentlichungen über die WP_Roles-Klasse. Können Sie sich einen Nachteil vorstellen, die Datenbank NICHT für Rollen zu verwenden? Und gibt es eine WP-Best Practice, um etwas nur einmal zu tun?
Tom Auger

Danke für das Update - Ich mag die Einfachheit der update_option-Lösung
Tom Auger

Nicht wirklich zufriedenstellend, aber es scheint die beste Lösung zu sein 👍
Blackbam
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.