Suporte » Plugins » Alterar função (role) em formulário

  • Resolvido Rafael Botelho

    (@rhenrigb)


    Como posso inserir a opção de alteração de função (role) em um formulário de edição de cadastro que tenho no meu site?

    Utilizei o código abaixo, mas o item 3 que seria para gravar a alteração não funciona:

    //1. Add a new form element...
    add_action( 'register_form', 'myplugin_register_form' );
    function myplugin_register_form() {
    
        global $wp_roles;
    
        echo '<select name="role" class="input">';
        foreach ( $wp_roles->roles as $key=>$value ) {
           // Exclude default roles such as administrator etc. Add your own
           if ( ! in_array( $value['name'], [ 'Administrator', 'Contributor', ] )) {
              echo '<option value="'.$key.'">'.$value['name'].'</option>';
           }
        }
        echo '</select>';
    }
    
    //2. Add validation.
    add_filter( 'registration_errors', 'myplugin_registration_errors', 10, 3 );
    function myplugin_registration_errors( $errors, $sanitized_user_login, $user_email ) {
    
        if ( empty( $_POST['role'] ) || ! empty( $_POST['role'] ) && trim( $_POST['role'] ) == '' ) {
             $errors->add( 'role_error', __( '<strong>ERROR</strong>: You must include a role.', 'mydomain' ) );
        }
    
        return $errors;
    }
    
    //3. Finally, save our extra registration user meta.
    add_action( 'user_register', 'myplugin_user_register' );
    function myplugin_user_register( $user_id ) {
    
       $user_id = wp_update_user( array( 'ID' => $user_id, 'role' => $_POST['role'] ) );
    }

    Alguém pode me ajudar?

Visualizando 9 respostas - 1 até 9 (de um total de 9)
  • Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá @rhenrigb, tudo bem?

    Não vi de cara nenhum erro.
    Vamos fazer dois testes, ok?

    1 – Imprima o $user_id em 3 (pode ser via log ou até um var_dump, mesmo… vai do gosto do freguês… hahaha)

    2 – Se o $user_id estiver OK (ou seja, não for um WP_Error), tenta mudar o name. Coloca qualquer_coisa_mesmo (ou até esse daí.. heheh).

    Abraços

    Criador do tópico Rafael Botelho

    (@rhenrigb)

    Olá @mariovalney, muito obrigado pelo retorno.

    Como eu posso fazer o passo 1? hahaha

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Bem, como você postou código, imaginei que saberia PHP, desculpe.

    Explicando melhor. Para o passo 1 você pode:

    ## Jeito simples:

    No item 3, faça assim:

    add_action( 'user_register', 'myplugin_user_register' );
    function myplugin_user_register( $user_id ) {
    
        $user_id = wp_update_user( array(
            'ID'    => $user_id,
            'role'  => $_POST['role'],
        ) );
    
        var_dump( $user_id ); die();
    }

    Aqui o site irá imprimir o valor e depois “quebrar” quando você submeter o formulário, afinal tem um die() ali.

    ## Jeito mais complicado:

    Vá no wp-config.php e adicione/altere:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_DISPLAY', false );
    define( 'WP_DEBUG_LOG', true );

    Aí lá no item 3 coloca:

    add_action( 'user_register', 'myplugin_user_register' );
    function myplugin_user_register( $user_id ) {
    
        $user_id = wp_update_user( array(
            'ID'    => $user_id,
            'role'  => $_POST['role'],
        ) );
    
        error_log( $user_id );
    }

    Nesse caso, a informação vai ser escrita no arquivo de LOG do WordPress.

    Mais informações sobre usar o log nesse link.

    • Esta resposta foi modificada 6 anos, 10 meses atrás por Mário Valney.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Nunca usei o formulário de registro do WP para criar páginas de cadastro/login, geralmente crio os meus, então não sei se seria possível usar os hooks que você apontou para um formulário edição do cadastro. E como você escreveu “edição de cadastro” na sua pergunta, gostaria de perguntar:

    Esse formulário está sendo para registrou ou edição de cadastro?

    Pois, se estiver usando para salvar informações de um usuário que já existe o hook certo seria o profile_update, já que o user_register só roda na criação/registro do usuário.

    Abraços

    • Esta resposta foi modificada 6 anos, 10 meses atrás por Mário Valney.
    Criador do tópico Rafael Botelho

    (@rhenrigb)

    @mariovalney, venho estudando PHP, mas não sei muitas coisas ainda.

    Imprimiu isso na tela ‘int(46)’, depois int(47) e assim por diante.

    PS: Vou abrir um parênteses aqui pra um detalhe. Estou usando o role no woocommerce_register_form_start, mas eu preciso que ele apareça em uma página que inseri um formulário de edição de dados do plugin Profile Builder, e eu não sei como mandar essa minha função pra ele. Já inseri o código pra chamar o woocommerce_edit_account_form_start dos detalhes da conta, mas quando salvo as alterações acontece o mesmo, não salva a mudança de função (role) do user.

    • Esta resposta foi modificada 6 anos, 10 meses atrás por Rafael Botelho.
    Criador do tópico Rafael Botelho

    (@rhenrigb)

    É para edição de cadastro @mariovalney.

    Deve ser esse o problema então, vou usar o profile_update e testar.

    Criador do tópico Rafael Botelho

    (@rhenrigb)

    @mariovalney meu código deveria ficar assim?

    add_action( 'profile_update', 'myplugin_user_register' );
    function myplugin_user_register( $user_id, $old_user_data ) {
    
       $user_id = wp_update_user( array( 'ID' => $user_id, 'role' => $old_user_data, 'role' => $_POST['role'] ) );
    
    }
    Criador do tópico Rafael Botelho

    (@rhenrigb)

    @mariovalney funcionou a alteração 🙂

    Mas ele vai pra uma página de erro e preciso voltar pra ver a alteração, dei um redirect, mas não funcionou, você sabe como faço isso:

    add_action( 'profile_update', 'myplugin_user_register' );
    function myplugin_user_register( $user_id ) {
    
       $user_id = wp_update_user( array( 'ID' => $user_id, 'role' => $_POST['role'] ) );
    
       wp_redirect( home_url() );    
        exit;
    }
    Criador do tópico Rafael Botelho

    (@rhenrigb)

    Deu certo @mariovalney!

    add_action( 'profile_update', 'myplugin_user_register' );
    function myplugin_user_register( $user_id ) {
    
    	 wp_redirect( home_url() );       
    
       $user_id = wp_update_user( array( 'ID' => $user_id, 'role' => $_POST['role'] ) );
    
    	exit;
    }

    O problema era o hook errado mesmo, vou inserir mais alguns campos no form de edição, mas aqui você já me ajudou.

    Muito obrigado!

    • Esta resposta foi modificada 6 anos, 10 meses atrás por Rafael Botelho.
Visualizando 9 respostas - 1 até 9 (de um total de 9)
  • O tópico ‘Alterar função (role) em formulário’ está fechado para novas respostas.