Enviar email de ativação do usuário ao criar programaticamente o usuário

9

Gostaria de saber se alguém aqui pode ser capaz de ajudar.

Basicamente, criei um formulário de registro personalizado que, quando validado, insere um usuário na tabela de usuários.

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    wp_insert_user($default_newuser);
} 

Agora, o que eu preciso fazer é enviar o email de confirmação que sei que posso fazer com o código a seguir.

wp_new_user_notification($user_id, $data['user_pass']);

Quero enviar um email de ativação do usuário. Eu tentei algumas coisas, mas não consigo encontrar nada concreto. Esperando que alguém possa ter esse problema antes.

Joe Buckle
fonte

Respostas:

10

Para concluir o processo de ativação do usuário, você precisa executar as seguintes etapas:

  1. depois de criar um novo usuário, adicione um campo de usuário personalizado que indique que esse usuário precisa ativar sua conta
  2. envie um email com o código de ativação, forneça um link neste email para uma página em que o usuário será ativado
  3. implementar página de ativação
  4. quando o usuário tentar efetuar login, verifique se esse campo de usuário personalizado existe ou não. Se existir, não faça o login e mostre a mensagem de erro de ativação.

Adicione um campo personalizado e envie um email:

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    $user_id = wp_insert_user($default_newuser);
    if ( $user_id && !is_wp_error( $user_id ) ) {
        $code = sha1( $user_id . time() );
        $activation_link = add_query_arg( array( 'key' => $code, 'user' => $user_id ), get_permalink( /* YOUR ACTIVATION PAGE ID HERE */ ));
        add_user_meta( $user_id, 'has_to_be_activated', $code, true );
        wp_mail( $data['user_email'], 'ACTIVATION SUBJECT', 'CONGRATS BLA BLA BLA. HERE IS YOUR ACTIVATION LINK: ' . $activation_link );
    }
}

Verifique a ativação do usuário no login:

// override core function
if ( !function_exists('wp_authenticate') ) :
function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    } elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
        $user = new WP_Error('activation_failed', __('<strong>ERROR</strong>: User is not activated.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        do_action('wp_login_failed', $username);
    }

    return $user;
}
endif;

Página de ativação:

add_action( 'template_redirect', 'wpse8170_activate_user' );
function wpse8170_activate_user() {
    if ( is_page() && get_the_ID() == /* YOUR ACTIVATION PAGE ID HERE */ ) {
        $user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
        if ( $user_id ) {
            // get user meta activation hash field
            $code = get_user_meta( $user_id, 'has_to_be_activated', true );
            if ( $code == filter_input( INPUT_GET, 'key' ) ) {
                delete_user_meta( $user_id, 'has_to_be_activated' );
            }
        }
    }
}

Este é o seu ponto de partida, vá em frente e ajuste-o de acordo com suas necessidades.

Eugene Manuilov
fonte
Bom post. Mas acho que você perdeu uma coisa. Quando você impede que usuários não autorizados façam login, como é possível obter o user_id de get_current_user_id () na página de ativação?
s1lv3r
11
caramba ... :) bom ponto, vai consertar isso em um minuto :) #
Eugene Manuilov 11/11
Obrigado por esta informação fantástica. Eu estava vendo se havia alguma solução principal para acionar o envio de um email de ativação, já que você pode "reenviar a ativação" no painel de administração. Eu pensei que, ao inserir um usuário como pendente, um código de ativação poderia ser gerado e inserido no banco de dados, mas após uma inspeção mais aprofundada, descobri que "obviamente" não tinha tanta sorte :) De qualquer forma. Tudo faz sentido e obrigado novamente.
Joe Buckle
@ JoeBuckle Isso é estranho. Você não deve ter um resend activationlink em uma instalação de baunilha. Você já tem um plugin instalado para isso? Além disso, o BuddyPress vem com uma funcionalidade de ativação do usuário pronta para uso.
s1lv3r
@ s1lv3r Poderia ter algo a ver com o Tema-Meu-Login?
Joe Buckle
1

Duas opções para escolher:

  1. Use um plug-in, por exemplo, email de ativação do usuário ou aprovação de novo usuário

  2. Codifique isso você mesmo.

Algumas funções que devem ajudar você a começar:

  • wp_mail () para enviar o email,
  • add_user_meta () para salvar uma chave de ativação para o usuário,
  • gere um link contendo a chave e coloque-o no email, crie uma página no wordpress que capture seu key-param (por exemplo, usando add_shortcode () ),
  • use get_user_meta () para verificar a chave de ativação contra a que está armazenada no banco de dados, coloque outra chave meta de usuário para marcar esse usuário como ativado se for bem-sucedido,
  • adicione uma função ao filtro de autenticação para impedir que qualquer usuário que não esteja ativado faça login.
s1lv3r
fonte
0

Você pode obter o user_id fazendo isso durante a autenticação:

$username='user email provided by the user at login panel.';
$results = $wpdb->get_row( "SELECT ID FROM wp_users WHERE user_email='".$username."'");
   $activation_id = $results->ID;
   $activation_key =  get_user_meta( $activation_id, 'has_to_be_activated', true );
 if($activation_key != false )
 {
  echo '<h4 class="error">Your account has not been activated yet.<br /> To activate it check your email and clik on the activation link.</h4>';
 }
else{
//authenticate your user login here...
}
Dasbairgaya
fonte