Wie ändere ich die Rolle eines Benutzers?

34

Ich habe benutzerdefinierte Rollen in meinem Setup und möchte in der Lage sein, die Rolle eines Benutzers durch eine Funktion automatisch zu ändern. Angenommen, Benutzer A hat eine ABONNENT-Rolle. Wie ändere ich sie in EDITOR? Beim Hinzufügen einer Rolle gehen wir einfach wie folgt vor:

add_role( $role_name , $role_display_name , array( 'read' =>  true,
                                                   'edit_posts' => false,
                                                   'delete_posts' => false, ));

Wie wäre es mit einem Rollenwechsel? Gibt es so etwas wie:

change_role($old_role, $new_role);

UPDATE: Ich denke, dieser wird tun:

$wp_user_object = new WP_User($current_user->ID);
$wp_user_object->set_role('editor');
Joann
quelle

Antworten:

50

In der Klasse WP_User können Sie Rollen für einen Benutzer hinzufügen und entfernen.

BEARBEITEN: Ich hätte mit dieser Antwort eigentlich mehr Informationen liefern sollen, also füge ich unten weitere Informationen hinzu.

Insbesondere kann die Rolle eines Benutzers festgelegt werden, indem eine Instanz der WP_user-Klasse erstellt und die Methoden add_role()oder aufgerufen remove_role()werden.

Beispiel

Ändern Sie die Rolle eines Abonnenten in einen Editor

// NOTE: Of course change 3 to the appropriate user ID
$u = new WP_User( 3 );

// Remove role
$u->remove_role( 'subscriber' );

// Add role
$u->add_role( 'editor' );

Hoffentlich ist das hilfreicher als meine erste Antwort, die nicht unbedingt so hilfreich war.

t31os
quelle
remove_role()und add_rule()Daten in der Datenbank speichern?
b_dubb
18

Beachten Sie nur, dass es eine einfachere Möglichkeit gibt, die Benutzerrolle zu ändern. Dies ist besonders hilfreich, wenn Sie die aktuelle Rolle des Benutzers nicht kennen: ->set_role()

Beispiel:

// Fetch the WP_User object of our user.
$u = new WP_User( 3 );

// Replace the current role with 'editor' role
$u->set_role( 'editor' );
Philipp
quelle
Denken Sie daran, dass set_role die vorherigen Rollen des Benutzers entfernt und die neue Rolle zuweist.
Shasi kanth
1
Dies ist perfekt für benutzerdefinierte Registrierungsformulare. Registrieren Sie zuerst Benutzer ohne Rollen und fügen Sie anschließend eine Rolle hinzu, wenn Sie die E-Mail bestätigen.
Ivijan Stefan Stipić
3

Um die Antwort von t31os zu extrapolieren, können Sie so etwas in Ihre Funktionsdatei einfügen, wenn Sie dies programmgesteuert basierend auf einer Bedingung tun möchten

$blogusers = get_users($blogID.'&role=student');

foreach ($blogusers as $user) {

    $thisYear = date('Y-7');
    $gradYear = date(get_the_author_meta( 'graduation_year', $user->ID ).'-7');

    if($gradYear < $thisYear) {
        $u = new WP_User( $user->ID );
        // Remove role
        $u->remove_role( 'student' );

        // Add role
        $u->add_role( 'adult' );
    }
}
Adam Munns
quelle
Ich denke, Ihre Verwendung von $blogIDist falsch. get_users()Standardmäßig wird die aktuelle Blog-ID trotzdem verwendet.
fuxia
Ja, in meinem Fall war die Paste nur ein Beispiel für mehrere Standorte. Ich habe es auch hier nicht definiert, so dass es offensichtlich einen Fehler auslösen würde.
Adam Munns
2

Sie können die Rolle eines Benutzers ändern, indem Sie das Benutzerprofil bearbeiten. Sie müssen keinen weiteren Code hinzufügen, wenn diese Option bereits in WordPress integriert ist.

Bildbeschreibung hier eingeben

Oder

Sie können Code verwenden, um alle aktuellen Benutzer mit der Abonnentenrolle zum Editor zu ändern:

$current_user = wp_get_current_user();

// Remove role
$current_user->remove_role( 'subscriber' );

// Add role
$current_user->add_role( 'editor' );
Brad Dalton
quelle
1

Dafür gibt es eine WordPress-Funktion!

Ich denke, es ist am besten, WordPress-Funktionen zu verwenden, wenn und wann sie verfügbar sind.

Sie können die Funktion wp_insert_user () verwenden. Eines der Argumente, die Sie angeben müssen, ist $ userdata ['role']. In diesem Argument können Sie die Rolle angeben, in die Sie den Benutzer ändern möchten.

Coen Jacobs
quelle
wp erkennt diese Funktion nicht. Ich habe einen Fehler "Undefinierte Funktion".
Joann
Wie es aussieht, scheint wp_insert_user () genau dasselbe zu tun. Wenn Sie eine ID angeben, wird diese ID aktualisiert. Keine ID fügt neuen Benutzer hinzu. Ich weiß noch nicht genau, was der Unterschied zwischen wp_update_user () und wp_insert_user () ist.
Coen Jacobs
1

Sie müssen die Datei /wp-includes/registration.php einschließen, wenn Sie den Code als eigenständiges Skript verwenden. Grüße Uwe


quelle
1

Sie können wp_update_user verwenden . Ihr Code sollte so aussehen:

<?php
    $user_id = 3;
    $new_role = 'editor';

    $result = wp_update_user(array('ID'=>$user_id, 'role'=>$new_role));

    if ( is_wp_error( $result ) ) {
        // There was an error, probably that user doesn't exist.
    } else {
        // Success!
    }
?>
Nour Edin Al-Habal
quelle
0
<?php
$wuser_ID = get_current_user_id();
if ($wuser_ID)
    {
      // NOTE: Of course change 3 to the appropriate user ID
      $u = new WP_User( $wuser_ID );

      // Remove role
      $u->remove_role( 'subscriber' );

      // Add role
      $u->add_role( 'contributor' );
    }
?>
Wasim Khan
quelle
0

Ich weiß, es ist ein sehr alter Beitrag, aber ich habe festgestellt, dass die Rollen für Benutzer in wp_usermetaTabelle mit Schlüssel wp_capabilitiesin meta_keySpalte gespeichert sind .

Wenn Sie die Benutzerrolle ändern möchten, können Sie dies mit dieser einfachen Funktion tun.

function change_role($id, $new_role){
    GLOBAL $table_prefix;
    if(is_array($new_role)){
        $new_role_array = $new_role;
    }else{
        $new_role_array = array( $new_role => true );
    }
    return update_user_meta($id, $table_prefix.'capabilities', $new_role_array);
}

Diese Funktion kann auf zwei Arten verwendet werden.

Wenn Sie die Rolle für eine einzelne Rolle ändern möchten.

change_role(2, 'editor'); // editor is the new role

Wenn Sie dem Benutzer mehrere Rollen hinzufügen möchten, verwenden Sie die Rollen als Array im zweiten Parameter.

$roles_array = array('editor' => true, 'administrator' => true); // roles array
change_role(2, $roles_array);

Viel Glück.

Mohammed Alhanafi
quelle