it-swarm.com.de

Hinzufügen benutzerdefinierter Benutzerfunktionen vor oder nach dem Hinzufügen der benutzerdefinierten Benutzerrolle?

Sollten benutzerdefinierte Benutzerfunktionen hinzugefügt werden, bevor die benutzerdefinierte Benutzerrolle hinzugefügt wurde, oder umgekehrt?

  • add_role() fragt nach einem Array von $capabilities im dritten Parameter der Funktion.
  • add_cap() fragt nach einem $role, auf den die Funktion im ersten Parameter der Funktion angewendet werden soll.

Beide add_role() und add_cap() müssen bei der Aktivierung des Plugins oder des Themas ausgelöst werden.

Ich dachte, erstellen Sie die benutzerdefinierten Benutzerfunktionen mit add_cap() und speichern Sie die Liste der Funktionen in einem Klasseneigenschaftsarray. Erstellen Sie dann jede benutzerdefinierte Benutzerrolle mit add_role() und fügen Sie die neu erstellten Funktionen aus dem Klasseneigenschaftsarray in den Parameter $capabilities jeder Funktion add_role() ein.

OR

Ich würde jede benutzerdefinierte Benutzerrolle mit add_role() hinzufügen und ein Klasseneigenschaftsarray für jede der Funktionen festlegen, die die Rolle hinzufügen soll. Dann würde ich für jede der Funktionen für jede benutzerdefinierte Benutzerrolle die Funktion mit add_cap() hinzufügen.

Die Reihenfolge, in der sowohl add_role() als auch add_cap() in Harmonie ausgeführt werden, ist mir ein Rätsel. Jeder Einblick in diese besondere Situation ist erwünscht.

Oder sollte ich einfach nicht einmal add_cap() verwenden? Kann ich einfach eine Reihe von Funktionen für jede Benutzerrolle einrichten und diese an den Parameter $capabilities der Funktion add_role() übergeben?

6
Michael Ecklund

Es gibt einen Grund, warum add_role() den $capabilities als 3. Parameter hat.

Zunächst einige Einblicke, was passiert, wenn Sie die Funktion verwenden.

  1. Es ruft WP_Roles->add_role() - die Klassenmethode auf
  2. Die Methode prüft dann, ob die Rolle bereits vorhanden ist. Wenn ja, wird es abgebrochen.
  3. Der nächste Schritt ist das Hinzufügen der Rolle zum WP_Roles->roles[]-Array mit dem display_name (2nd arg) auf den Eintrag in der $wpdb->prefix . 'user_roles'-Optionstabelle (ein Array).

Fazit

Wenn Sie also die Funktionen beim Erstellen der Rolle nicht richtig hinzufügen, speichern Sie eine Rolle mit leeren Funktionen.

Eine Anmerkung zum Kodex

Vertraue niemals dem Kodex. Es gibt einfach keine Funktion namens add_cap(). Es gibt nur Klassenmethoden in WP_Roles, WP_Role und WP_User, die so benannt sind. (Aktualisiert den Codex-Eintrag, wenn ich etwas Zeit finde.)

5
kaiser

Für alle, die vielleicht die gleiche Frage gestellt haben oder zumindest über die gleiche Frage nachgedacht haben ... Hier ist, wie ich mit der Situation umgegangen bin.

Beachten Sie, dass in diesem Szenario eine bereits vorhandene Benutzerbasis aktualisiert wird. Es gab bereits Hunderte von Benutzern, die aktiv an dieser Community-Website teilnahmen.

Wir haben das Ranking-System der Website geändert. (Ränge waren benutzerdefinierte Benutzerrollen.) Sie könnten einen höheren Rang erreichen, indem Sie mehr an der Community teilnehmen. Sobald der Benutzer seine Ziele erreicht hat, wird er zu einer neuen benutzerdefinierten Benutzerrolle mit mehr Zugriff auf die Community-Website befördert.

Es gab bereits benutzerdefinierte Benutzerrollen, die jedem Benutzer der Community zugewiesen wurden. Wir wollten lediglich die Namen der benutzerdefinierten Benutzerrollen ändern, einige weitere hinzufügen und diesen Rängen neue Berechtigungen zuweisen (Fügen Sie in WordPress neue Funktionen für jede benutzerdefinierte Benutzerrolle hinzu).


Schritt 1 - Benutzer-Meta aktualisieren

Rufen Sie alle Benutzer ab, bestimmen Sie deren aktuelle benutzerdefinierte Benutzerrolle, fügen Sie die neue Rolle hinzu und entfernen Sie alle anderen vorhandenen Rollen. (Wir haben einige der bereits vorhandenen Benutzerrollen sicher aufgelistet, weil wir sicherstellen wollten, dass diese unverändert bleiben und nicht geändert oder entfernt werden.)

Hinweis: In diesem Schritt werden keine benutzerdefinierten Benutzerrollen hinzugefügt. Es wird im Wesentlichen nur das Benutzer-Meta jedes Benutzers aktualisiert, sodass WordPress weiß, welche Rolle er hat und welche registrierte Rolle es Berechtigungen oder Funktionen für einen späteren Zeitpunkt überprüfen sollte.

private function update_user_roles(){
    global $wp_roles;   

    /* Don't update users with these roles. */
    $safelisted_roles = array(
        'administrator',
        'editor',
        'author',
        'contributor',
        'subscriber', 
        'bbp_moderator',
        'bbp_participant'
    );

    /* Convert existing user's role to the newly added roles. */
    $users = get_users();
    for($i = 0; $i < count($users); $i++){
        $user = new WP_User($users[$i]->ID);
        /* Skip user, if user has no roles. */
        if(is_array($user->roles) && empty($user->roles) || !is_array($user->roles)){
            continue;
        }
        foreach($user->roles as $role){
            if($role == 'rank_name'){// Existing user role
                $user->add_role('new_rank_name');// New user role
            } else{
                /* Set remaining users as Subscribers, ignoring safe-listed user roles. */
                if(!in_array($role, $safelisted_roles)){
                    $user->add_role('subscriber');// Reset everyone to default role.
                }
            }
            /* Remove the old junky roles from the user, ignoring safe-listed user roles. */
            if(!in_array($role, $safelisted_roles)){
                $user->remove_role($role);
            }
        }
    }
}

Also haben wir im Grunde genommen alle Benutzer durchgesehen, ihre aktuelle Benutzerrolle überprüft und entschieden, ihnen eine neue Rolle zuzuweisen oder nicht. Wenn sich die Rolle des Benutzers in der Safe-Liste befand, blieb ihre Rolle dieselbe.


Schritt 2 - Definieren Sie neue Benutzerrollen und -funktionen

Erstellen Sie eine separate Methode zum Vorbereiten der neuen Benutzerrollen und -funktionen, um den Code übersichtlicher und übersichtlicher zu gestalten. Auf diese Weise können Sie Ihre Funktionen für jede benutzerdefinierte Benutzerrolle besser verwalten und alles einfacher und übersichtlicher hinzufügen.

Wir haben die Daten dieser Methode in einer Klasseneigenschaft ($this->user_capabilities) im Array-Format gespeichert, um sie im nächsten Schritt zu verwenden.

/* Prepare specific permissions for each new user role. */
public function set_user_capabilities(){
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_one',// Registered role name
        'role_value' => 'Rank One',// Role display name
        'capabilities' => array(// Permissions
            'new_capability_one' => true,
            'new_capability_two' => false,
            'new_capability_three' => false
        )
    );
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_two',
        'role_value' => 'Rank Two',
        'capabilities' => array(
            'new_capability_one' => true,
            'new_capability_two' => true,
            'new_capability_three' => false
        )
    );
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_three',
        'role_value' => 'Rank Three',
        'capabilities' => array(
            'new_capability_one' => true,
            'new_capability_two' => true,
            'new_capability_three' => true
        )
    );
}

Der Schlüssel der Klasseneigenschaft $this->user_capabilities ist genau genommen der Ort, an dem Sie die benutzerdefinierte Benutzerrolle platzieren würden, die hinzugefügt werden soll. Enthält innerhalb des Arrays alle Funktionen, die diese Rolle haben wird. Diese Funktionen gewähren mehr Zugriff auf die Site.

Hinweis: Wie teilen sich alle drei neuen Benutzerrollen die gleichen Fähigkeiten? Die erste Benutzerrolle erbt nur die Berechtigung für die erste Funktion, die zweite Benutzerrolle erbt die Berechtigung für die ersten beiden Funktionen, da sie einen höheren Rang haben, und die dritte Benutzerrolle erbt die Berechtigung für alle drei Funktionen, da dies der höchste Rang ist und hat die meisten Berechtigungen.


Schritt 3 - Gemeinsame Berechtigungen definieren und Benutzerrollen erstellen

Wir mussten einige allgemeine Funktionen festlegen, die alle registrierten Benutzer gemeinsam nutzen mussten. Daher haben wir unmittelbar vor dem Hinzufügen jeder neuen benutzerdefinierten Benutzerrolle ein separates Array von gemeinsam genutzten Funktionen erstellt und diese mit den in Schritt 2 erstellten Funktionen der einzelnen Benutzerrollen zusammengeführt, die in der Eigenschaft class ($this->user_capabilities) gespeichert sind. Auch hier müssen wir unsere auf der Liste der sicheren Benutzer aufgeführten Rollen respektieren.

/* Add custom user roles for registered members. */
public function set_user_roles(){
    global $wp_roles;

    /* Global capabilities for all registered users. */
    $user_capabilities = array(
        'bp_groups' => true,
        'bp_groups_create' => true,
        'bp_groups_join' => true,
        'bp_groups_directory' => true,
        'bp_groups_search' => true
    );

    /* Don't update users with these roles. */
    $safelisted_roles = array(
        'administrator',
        'editor',
        'author',
        'contributor',
        'subscriber', 
        'bbp_moderator',
        'bbp_participant'
    );

    /* Remove old junky user roles. */
    foreach($wp_roles->get_names() as $role_name => $display_name){
        if(!in_array($role_name, $safelisted_roles)){
            $wp_roles->remove_role($role_name);
        }
    }

    /* Add new custom user roles. */
    for($i = 0; $i < count($this->user_capabilities); $i++){
        $role = $this->user_capabilities[$i];
        $capabilities = array_merge($user_capabilities, $role['capabilities']);
        $wp_roles->add_role($role['role_key'], $role['role_value'], $capabilities);
    }

}

Abschließende Zusammenfassung ... Wir erstellen eine Liste der Berechtigungsberechtigungen, die alle registrierten Benutzer unabhängig von ihrem Rang teilen müssen. Wir haben dann jede einzelne registrierte benutzerdefinierte Benutzerrolle entfernt, die bei WordPress registriert ist (es sei denn, es wurde als sicher eingestuft, dass es nicht geändert werden darf). Anschließend haben wir jede der neuen benutzerdefinierten Benutzerrollen erstellt und alle Funktionen für jede neue Benutzerrolle zugewiesen. Die Rollen, die wir in den Metas des Benutzers aus Schritt 1 festgelegt haben, werden jetzt in WordPress wirksam.


Fazit

Das hat bei mir funktioniert. Aktualisieren Sie alle Metadaten Ihres Benutzers mit den Rollen, die Sie hinzufügen möchten. Registrieren Sie anschließend neu erstellte benutzerdefinierte Benutzerrollen bei WordPress.

2
Michael Ecklund