Come cambiare il ruolo di un utente?
Ho dei ruoli personalizzati nel mio setup e voglio essere in grado di cambiare automaticamente il ruolo di un utente attraverso una funzione. Ad esempio, se l'utente A ha un ruolo SOTTOSCRITTORE, come posso cambiarlo in EDITOR? Quando aggiungiamo un ruolo usiamo semplicemente:
add_role( $role_name , $role_display_name , array( 'read' => true,
'edit_posts' => false,
'delete_posts' => false, ));
E per quanto riguarda il cambio di ruolo? Esiste qualcosa del tipo:
change_role($old_role, $new_role);
AGGIORNAMENTO: Penso che questo funzionerà:
$wp_user_object = new WP_User($current_user->ID);
$wp_user_object->set_role('editor');

Vedi la classe WP_User, puoi utilizzarla per aggiungere e rimuovere ruoli per un utente.
Nello specifico, il ruolo di un utente può essere modificato creando un'istanza della classe WP_User
e chiamando i metodi add_role
, remove_role
o set_role
a seconda delle tue esigenze.
Esempio
Rimozione del ruolo subscriber e successiva aggiunta del ruolo editor.
// Assicurati di modificare `3` con un ID utente appropriato
$u = new WP_User( 3 );
// Rimuovi ruolo
$u->remove_role( 'subscriber' );
// Aggiungi ruolo
$u->add_role( 'editor' );
I metodi add e remove sono probabilmente più adatti a casi d'uso in cui agli utenti vengono assegnati più ruoli.
Se il tuo obiettivo è semplicemente cambiare un ruolo, questo può essere fatto più facilmente utilizzando il metodo set_role
, in questo modo.
// Assicurati di modificare `10` con un ID utente appropriato
$u = new WP_User( 10 );
// Cambia ruolo
$u->set_role( 'author' );
Spero che questo ti sia utile.

Tieni presente che esiste un modo più semplice per modificare il ruolo dell'utente, particolarmente utile quando non conosci il ruolo corrente dell'utente: ->set_role()
Esempio:
// Recupera l'oggetto WP_User del nostro utente.
$u = new WP_User( 3 );
// Sostituisci il ruolo corrente con il ruolo 'editor'
$u->set_role( 'editor' );

Ricorda che set_role rimuoverà i ruoli precedenti dell'utente e assegnerà il nuovo ruolo.

Per ampliare la risposta di t31os, puoi inserire qualcosa come questo nel tuo file functions se vuoi farlo in modo programmatico in base a una condizione
$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 );
// Rimuove il ruolo
$u->remove_role( 'student' );
// Aggiunge il ruolo
$u->add_role( 'adult' );
}
}

Penso che il tuo utilizzo di $blogID
sia sbagliato. get_users()
utilizzerà comunque l'ID del blog corrente per impostazione predefinita.

Puoi modificare il ruolo di qualsiasi utente modificando il profilo dell'utente. Non è necessario aggiungere altro codice quando questa opzione è già integrata in WordPress.
Oppure
Puoi utilizzare del codice per cambiare tutti gli utenti attuali con il ruolo di sottoscrittore in editor:
$current_user = wp_get_current_user();
// Rimuovi ruolo
$current_user->remove_role( 'subscriber' );
// Aggiungi ruolo
$current_user->add_role( 'editor' );

C'è una funzione WordPress per quello!
Penso sia meglio utilizzare le funzioni di WordPress, quando e se sono disponibili.
Puoi usare la funzione wp_insert_user(), dove uno degli argomenti che dovrai fornire è $userdata['role']. In questo argomento puoi specificare il ruolo in cui vuoi cambiare l'utente.

wp non riconosce quella funzione. Ho ricevuto un errore "funzione non definita".

Puoi utilizzare wp_update_user. Il tuo codice dovrebbe essere così:
<?php
$user_id = 3;
$new_role = 'editor';
$result = wp_update_user(array('ID'=>$user_id, 'role'=>$new_role));
if ( is_wp_error( $result ) ) {
// Si è verificato un errore, probabilmente l'utente non esiste.
} else {
// Successo!
}
?>

So che è un post molto vecchio, ma ho scoperto che i ruoli degli utenti sono memorizzati nella tabella wp_usermeta
con la chiave wp_capabilities
nella colonna meta_key
.
Se vuoi cambiare il ruolo di un utente puoi farlo con questa semplice funzione.
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);
}
Ci sono due modi per utilizzare questa funzione.
Se vuoi cambiare il ruolo con un singolo ruolo.
change_role(2, 'editor'); // editor è il nuovo ruolo
Oppure se vuoi aggiungere più ruoli all'utente, utilizza i ruoli come array nel secondo parametro.
$roles_array = array('editor' => true, 'administrator' => true); // array di ruoli
change_role(2, $roles_array);
Buona fortuna.
