Comment changer le rôle d'un utilisateur?

34

J'ai des rôles personnalisés dans ma configuration et je veux pouvoir modifier automatiquement le rôle d'un utilisateur via une fonction. Supposons que l'utilisateur A ait un rôle d'abonné, comment puis-je le changer en EDITOR? Lors de l'ajout d'un rôle, nous venons de:

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

Que diriez-vous de changer de rôle? Y a-t-il quelque chose comme:

change_role($old_role, $new_role);

UPDATE: Je pense que celui-ci fera:

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

Réponses:

50

Voir la classe WP_User . Vous pouvez l'utiliser pour ajouter et supprimer des rôles à un utilisateur.

EDIT: J'aurais vraiment dû fournir plus d'informations avec cette réponse au départ, alors j'ajoute plus d'informations ci-dessous.

Plus spécifiquement, le rôle d'un utilisateur peut être défini en créant une instance de la classe WP_user et en appelant les méthodes add_role()ou remove_role().

Exemple

Changer un rôle d'abonné en éditeur

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

J'espère que c'est plus utile que ma réponse initiale, qui n'était pas nécessairement aussi utile.

t31os
la source
remove_role()et add_rule()sauvegarder des données dans la base de données?
b_dubb
18

Notez simplement qu'il existe un moyen plus simple de modifier le rôle d'utilisateur, ce qui est particulièrement utile lorsque vous ne connaissez pas le rôle actuel de l'utilisateur: ->set_role()

Exemple:

// 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
la source
N'oubliez pas que set_role supprimera les rôles précédents de l'utilisateur et attribuera le nouveau rôle.
Shasi Kanth
1
C'est parfait pour les formulaires d'inscription personnalisés. Commencez par enregistrer les utilisateurs sans rôles, puis ajoutez-les lorsqu'ils confirmeront leur courrier électronique.
Ivijan Stefan Stipić
3

Pour extrapoler la réponse de t31os, vous pouvez insérer quelque chose comme ceci dans votre fichier de fonctions si vous souhaitez le faire par programme en fonction d'une condition.

$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
la source
Je pense que votre utilisation de $blogIDest mauvaise. get_users()utilisera de toute façon l'ID de blog actuel par défaut.
fuxia
Eh oui, dans mon cas, la pâte était juste à partir d'un exemple multisite. Je ne l'ai pas défini ici non plus, alors évidemment, cela jetterait une erreur.
Adam Munns
2

Vous pouvez modifier le rôle de n'importe quel utilisateur en modifiant son profil. Plus besoin d'ajouter de code lorsque cette option est déjà intégrée à WordPress.

entrez la description de l'image ici

Ou

Vous pouvez utiliser le code pour changer tous les utilisateurs actuels avec le rôle d'abonné en éditeur:

$current_user = wp_get_current_user();

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

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

Il y a une fonction WordPress pour ça!

Je pense qu'il est préférable d'utiliser les fonctions WordPress, si et quand elles sont disponibles.

Vous pouvez utiliser la fonction wp_insert_user () , où l’un des arguments à fournir est le $ userdata ['role']. Dans cet argument, vous pouvez spécifier le rôle en lequel vous souhaitez changer l'utilisateur.

Coen Jacobs
la source
wp ne reconnaît pas cette fonction. J'ai eu une erreur "fonction non définie".
Joann
En apparence, wp_insert_user () semble faire exactement la même chose. Lorsque vous fournissez un identifiant, cet identifiant est mis à jour. Aucun identifiant n’ajoute un nouvel utilisateur. Je ne sais pas encore quelle est la différence entre wp_update_user () et wp_insert_user ().
Coen Jacobs
1

vous devez inclure le fichier /wp-includes/registration.php si vous utilisez le code en tant que script autonome. Cordialement Uwe


la source
1

Vous pouvez utiliser wp_update_user . Votre code devrait être comme ceci:

<?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
la source
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
la source
0

Je sais que très ancien poste, mais j'ai trouvé que les rôles pour les utilisateurs sont stockés dans le wp_usermetatableau avec la clé wp_capabilitiesdans la meta_keycolonne.

Si vous voulez changer le rôle d'utilisateur, vous pouvez le faire avec cette simple fonction.

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

Il y a deux façons d'utiliser cette fonction.

Si vous souhaitez modifier le rôle pour un seul rôle.

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

Ou si vous souhaitez ajouter plusieurs rôles à l'utilisateur, utilisez les rôles comme tableau dans le deuxième paramètre.

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

Bonne chance.

Mohammed Alhanafi
la source