Как изменить роль пользователя?
У меня настроены пользовательские роли, и я хочу иметь возможность автоматически изменять роль пользователя через функцию. Допустим, у пользователя A есть роль SUBSCRIBER, как мне изменить ее на EDITOR? При добавлении роли мы просто используем:
add_role( $role_name , $role_display_name , array( 'read' => true,
'edit_posts' => false,
'delete_posts' => false, ));
А как насчет изменения роли? Есть ли что-то вроде:
change_role($old_role, $new_role);
ОБНОВЛЕНИЕ: Думаю, это сработает:
$wp_user_object = new WP_User($current_user->ID);
$wp_user_object->set_role('editor');

Смотрите класс WP_User, его можно использовать для добавления и удаления ролей пользователя.
Конкретно, роль пользователя можно изменить, создав экземпляр класса WP_User
и вызвав методы add_role
, remove_role
или set_role
в зависимости от ваших требований.
Пример
Удаление роли подписчика и добавление роли редактора.
// Убедитесь, что заменили `3` на соответствующий ID пользователя
$u = new WP_User( 3 );
// Удаление роли
$u->remove_role( 'subscriber' );
// Добавление роли
$u->add_role( 'editor' );
Методы добавления и удаления, вероятно, лучше всего подходят для случаев, когда пользователям назначаются несколько ролей.
Если ваша цель — просто изменить роль, это проще сделать с помощью метода set_role
, как показано ниже.
// Убедитесь, что заменили `10` на соответствующий ID пользователя
$u = new WP_User( 10 );
// Изменение роли
$u->set_role( 'author' );
Надеюсь, это поможет.

Обратите внимание, что существует более простой способ изменить роль пользователя, который особенно полезен, когда вы не знаете текущую роль пользователя: ->set_role()
Пример:
// Получаем объект WP_User для нашего пользователя.
$u = new WP_User( 3 );
// Заменяем текущую роль на роль 'editor'
$u->set_role( 'editor' );

Помните, что set_role удалит предыдущие роли пользователя и назначит новую роль.

Чтобы расширить ответ t31os, вы можете добавить что-то подобное в файл functions.php, если хотите выполнить это программно на основе условия:
$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 );
// Удаляем роль
$u->remove_role( 'student' );
// Добавляем новую роль
$u->add_role( 'adult' );
}
}

Я думаю, вы неправильно используете $blogID
. get_users()
по умолчанию и так использует ID текущего блога.

<?php
$wuser_ID = get_current_user_id();
if ($wuser_ID)
{
// ПРИМЕЧАНИЕ: Конечно, замените 3 на соответствующий ID пользователя
$u = new WP_User( $wuser_ID );
// Удалить роль
$u->remove_role( 'subscriber' );
// Добавить роль
$u->add_role( 'contributor' );
}
?>

Вы можете изменить роль любого пользователя, редактируя его профиль. Нет необходимости добавлять дополнительный код, так как эта функция уже встроена в WordPress.
Или
Вы можете использовать код, чтобы изменить роль всех текущих пользователей с ролью подписчика на редактора:
$current_user = wp_get_current_user();
// Удалить роль
$current_user->remove_role( 'subscriber' );
// Добавить роль
$current_user->add_role( 'editor' );

В WordPress для этого есть функция!
Я считаю, что лучше использовать функции WordPress, когда они доступны.
Вы можете использовать функцию wp_insert_user(), где одним из аргументов, который вам нужно указать, является $userdata['role']. В этом аргументе вы можете указать роль, в которую хотите преобразовать пользователя.

WordPress не распознает эту функцию. Я получаю ошибку "undefined function".

Вы можете использовать wp_update_user. Ваш код должен выглядеть так:
<?php
$user_id = 3;
$new_role = 'editor';
$result = wp_update_user(array('ID'=>$user_id, 'role'=>$new_role));
if ( is_wp_error( $result ) ) {
// Произошла ошибка, возможно, пользователь не существует.
} else {
// Успех!
}
?>

Я знаю, что это очень старый пост, но я обнаружил, что роли пользователей хранятся в таблице wp_usermeta
с ключом wp_capabilities
в столбце meta_key
.
Если вы хотите изменить роль пользователя, вы можете сделать это с помощью этой простой функции.
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);
}
Есть два способа использования этой функции.
Если вы хотите изменить роль на одну роль.
change_role(2, 'editor'); // editor - это новая роль
Или если вы хотите добавить несколько ролей пользователю, используйте массив ролей во втором параметре.
$roles_array = array('editor' => true, 'administrator' => true); // массив ролей
change_role(2, $roles_array);
Удачи.
