Как изменить роль пользователя?

34

У меня есть пользовательские роли в моей настройке, и я хочу иметь возможность автоматически изменять роль пользователя через функцию. Скажите, что у пользователя А есть роль ПОДПИСЧИКА, как я могу изменить его на РЕДАКТОР? При добавлении роли мы просто:

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');
Джоанн
источник

Ответы:

50

Посмотрите класс WP_User , вы можете использовать его для добавления и удаления ролей для пользователя.

РЕДАКТИРОВАТЬ: я действительно должен был предоставить больше информации с этого ответа изначально, поэтому я добавляю больше информации ниже.

В частности, роль пользователя можно установить, создав экземпляр класса WP_user и вызвав методы add_role()или remove_role().

пример

Изменить роль подписчика на редактор

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

Надеюсь, это более полезно, чем мой первоначальный ответ, который не обязательно был таким полезным.

t31os
источник
remove_role()и add_rule()сохранить данные в базу данных?
b_dubb
18

Просто отметьте, что существует более простой способ изменить роль пользователя, что особенно полезно, когда вы не знаете текущую роль пользователя: ->set_role()

Пример:

// 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
источник
Помните, что set_role удалит предыдущие роли пользователя и назначит новую роль.
Шаси Кант
1
Это идеально подходит для пользовательских регистрационных форм. Сначала зарегистрируйте пользователей без ролей, а затем добавьте роль, когда они подтвердят электронную почту.
Ивиян Стефан Стипич
3

Чтобы экстраполировать ответ t31os, вы можете добавить что-то подобное в свой файл функций, если вы хотите сделать это программно на основе условия

$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' );
    }
}
Адам Маннс
источник
Я думаю, что вы используете $blogIDнеправильно. get_users()в любом случае будет использовать текущий идентификатор блога по умолчанию.
fuxia
да, в моем случае паста была только из мультисайтового примера. Я также не определил это здесь так очевидно, что это вызовет ошибку.
Адам Маннс
2

Вы можете изменить роль любого пользователя, отредактировав профиль пользователя. Нет необходимости добавлять больше кода, когда эта опция уже встроена в WordPress.

введите описание изображения здесь

Или

Вы можете использовать код, чтобы изменить всех текущих пользователей с ролью подписчика на редактор:

$current_user = wp_get_current_user();

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

// Add role
$current_user->add_role( 'editor' );
Брэд Далтон
источник
1

Для этого есть функция WordPress!

Я думаю, что лучше всего использовать функции WordPress, если и когда они доступны.

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

Коэн Джейкобс
источник
wp не распознает эту функцию. Я получил ошибку "неопределенная функция".
Джоанн
Судя по всему, wp_insert_user (), кажется, делает то же самое. Когда вы предоставляете идентификатор, этот идентификатор обновляется. ID не добавляет нового пользователя. Пока не знаю, в чем разница между wp_update_user () и wp_insert_user ().
Коэн Джейкобс
1

Вы должны включить /wp-includes/registration.php, если вы используете код в качестве отдельного скрипта. С уважением Уве


источник
1

Вы можете использовать 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 ) ) {
        // There was an error, probably that user doesn't exist.
    } else {
        // Success!
    }
?>
Нур Эдин Аль-Хабаль
источник
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' );
    }
?>
Васим Хан
источник
0

Я знаю, что это очень старый пост, но я обнаружил, что роли для пользователей хранятся в 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 is the new role

Или, если вы хотите добавить несколько ролей для пользователя, используйте роли как массив во втором параметре.

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

Удачи.

Мухаммед Альханафи
источник