web-dev-qa-db-fra.com

Envoyer un courrier électronique d'activation d'utilisateur lors de la création d'un utilisateur par programme

Je me demandais si quelqu'un ici pourrait peut-être aider.

Fondamentalement, j'ai créé un formulaire d'inscription personnalisé qui, lorsqu'il est validé, insère un utilisateur dans la table des utilisateurs.

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

Maintenant, ce dont j'ai besoin, c'est plutôt que d'envoyer l'e-mail de confirmation que je sais pouvoir faire avec le code suivant.

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

Je veux plutôt envoyer un courriel d'activation d'utilisateur. J'ai essayé quelques choses mais je n'arrive pas à trouver quoi que ce soit de concret. En espérant que quelqu'un aurait déjà eu ce problème auparavant.

9
Joe Buckle

Pour accomplir le processus d'activation de l'utilisateur, vous devez suivre les étapes suivantes:

  1. après la création d'un nouvel utilisateur, ajoutez un champ d'utilisateur personnalisé indiquant que cet utilisateur doit activer son compte
  2. envoyer un email avec le code d'activation, fournissez un lien dans cet email vers une page où l'utilisateur sera activé
  3. implémenter la page d'activation
  4. lorsque l'utilisateur tente de se connecter, vérifiez si ce champ d'utilisateur personnalisé existe ou non. S'il existe, alors ne le connectez pas et ne montrez pas le message d'erreur d'activation.

Ajouter un champ personnalisé et envoyer un 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 );
    }
}

Vérifier l'activation de l'utilisateur lors de la connexion:

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

Page d'activation:

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

Ceci est votre point de départ, allez-y et ajustez-le à vos besoins.

9
Eugene Manuilov

Deux options au choix:

  1. Utilisez un plugin, par exemple E-mail d'activation de l'utilisateur ou Nouvel utilisateur approuvé

  2. Codez ceci vous-même.

Quelques fonctions qui devraient vous aider à démarrer:

  • wp_mail () pour envoyer l'e-mail,
  • add_user_meta () pour enregistrer une clé d'activation pour l'utilisateur,
  • générer un lien contenant la clé et le placer dans l'email, créer une page dans wordpress qui capture votre clé-param (par exemple, avec add_shortcode () ),
  • utilisez get_user_meta () pour comparer la clé d’activation à celle stockée dans la base de données, placez une autre clé méta-utilisateur pour marquer cet utilisateur comme activé si elle réussit,
  • ajoutez une fonction au filtre authenticate pour empêcher tout utilisateur non activé de se connecter.
1
s1lv3r

Vous pouvez obtenir le user_id en faisant ceci pendant l'authentification:

$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...
}
0
Dasbairgaya