Como mudar a função de um usuário?

34

Tenho funções personalizadas em minha configuração e desejo poder alterar automaticamente a função de um usuário por meio de uma função. Digamos que o usuário A tenha uma função de ASSINANTE, como faço para alterá-lo para EDITOR? Ao adicionar uma função, apenas:

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

Que tal mudar um papel? Existe algo como:

change_role($old_role, $new_role);

UPDATE: Eu acho que este fará:

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

Respostas:

50

Veja a classe WP_User , você pode usar isso para adicionar e remover funções para um usuário.

Edição: Eu realmente deveria ter fornecido mais informações com esta resposta inicialmente, por isso estou adicionando mais informações abaixo.

Mais especificamente, a função de um usuário pode ser definida criando uma instância da classe WP_user e chamando os métodos add_role()ou remove_role().

Exemplo

Alterar uma função de assinante para 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' );

Espero que seja mais útil do que minha resposta inicial, o que não foi necessariamente tão útil.

t31os
fonte
remove_role()e add_rule()salvar dados no banco de dados?
b_dubb 29/10
18

Observe que existe uma maneira mais simples de alterar a função do usuário, o que é especialmente útil quando você não conhece a função atual do usuário: ->set_role()

Exemplo:

// 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
fonte
Lembre-se de que set_role removerá as funções anteriores do usuário e designará a nova função.
Shasi kanth
11
Isso é perfeito para formulários de registro personalizados. Primeiro, registre usuários sem funções e depois adicione a função quando confirmarem o email.
Ivijan Stefan Stipić
3

Para extrapolar na resposta do t31os, você pode colocar algo assim no seu arquivo de funções se quiser fazer isso programaticamente com base em uma condição

$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
fonte
Eu acho que seu uso $blogIDestá errado. get_users()de qualquer maneira, usará o ID do blog atual por padrão.
fuxia
Sim, no meu caso, a pasta era apenas de um exemplo multisite. Também não o defini aqui, portanto, obviamente, isso geraria um erro.
26612 Adam Munns
2

Você pode alterar a função de qualquer usuário editando o perfil de usuários. Não há necessidade de adicionar mais código quando essa opção já estiver incorporada no WordPress.

insira a descrição da imagem aqui

Ou

Você pode usar o código para alterar todos os usuários atuais com a função de assinante para editor:

$current_user = wp_get_current_user();

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

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

Há uma função WordPress para isso!

Eu acho que é melhor usar as funções do WordPress, se e quando estiverem disponíveis.

Você pode usar a função wp_insert_user () , onde um dos argumentos que você precisará fornecer é o $ userdata ['role']. Nesse argumento, você pode especificar a função na qual deseja mudar o usuário.

Coen Jacobs
fonte
O wp não reconhece essa função. Eu recebi um erro de "função indefinida".
Joann1
Pelo jeito, wp_insert_user () parece fazer exatamente o mesmo. Quando você fornece um ID, esse ID é atualizado. Nenhum ID está adicionando novo usuário. Ainda não sei qual é a diferença entre wp_update_user () e wp_insert_user ().
Coen Jacobs
1

você deve incluir o /wp-includes/registration.php, se você usar o código como um script independente. Atenciosamente Uwe


fonte
1

Você pode usar wp_update_user . Seu código deve ser assim:

<?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
fonte
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
fonte
0

Eu sei que é uma publicação muito antiga, mas descobri que as funções dos usuários são armazenadas na wp_usermetatabela com a chave wp_capabilitiesna meta_keycoluna.

Se você deseja alterar a função do usuário, pode fazê-lo com esta função simples.

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

Há duas maneiras de usar esta função.

Se você deseja alterar a função para uma única função.

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

Ou, se você quiser adicionar várias funções ao usuário, use as funções como matriz no segundo parâmetro.

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

Boa sorte.

Mohammed Alhanafi
fonte