Envoyer un e-mail d'activation de l'utilisateur lors de la création d'un utilisateur par programme

9

Je me demandais si quelqu'un ici pourrait aider.

Fondamentalement, j'ai créé un formulaire d'inscription personnalisé qui, une fois 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 que je peux faire avec le code suivant.

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

Je souhaite plutôt envoyer un e-mail d'activation de l'utilisateur. J'ai essayé quelques trucs mais je n'arrive pas à trouver quoi que ce soit de concret. En espérant que quelqu'un ait déjà eu ce problème auparavant.

Joe Buckle
la source

Réponses:

10

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

  1. après avoir créé un nouvel utilisateur, ajoutez un champ d'utilisateur personnalisé qui indique que cet utilisateur doit activer son compte
  2. envoyer un e-mail avec le code d'activation, fournir un lien dans cet e-mail 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 utilisateur personnalisé existe ou non. S'il existe, ne le connectez pas et affichez plutôt un message d'erreur d'activation.

Ajouter un champ personnalisé et envoyer un e-mail:

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

C'est votre point de départ, allez-y et ajustez-le en fonction de vos besoins.

Eugene Manuilov
la source
Bon post. Mais je pense que vous avez raté une chose. Lorsque vous empêchez des utilisateurs non autorisés de se connecter, comment pouvez-vous obtenir l'ID utilisateur de get_current_user_id () sur la page d'activation?
s1lv3r
1
putain ... :) bon point, le réparera dans une minute :)
Eugene Manuilov
Merci pour ces informations fantastiques. Je voyais s'il y avait une solution de base pour simplement déclencher l'envoi d'un e-mail d'activation car vous pouvez «renvoyer l'activation» dans le panneau d'administration. Je pensais qu'en insérant un utilisateur en attente, un code d'activation pourrait être généré et inséré dans la base de données, mais après une inspection plus approfondie, j'ai découvert que «évidemment», pas de chance :) Quoi qu'il en soit. Tout cela a du sens et merci encore.
Joe Buckle
@JoeBuckle C'est étrange. Vous ne devriez pas du tout avoir de resend activationlien sur une installation vanilla. Avez-vous déjà installé un plugin pour cela? BuddyPress est également livré avec une fonctionnalité d'activation utilisateur prête à l'emploi.
s1lv3r
@ s1lv3r Cela pourrait-il avoir quelque chose à voir avec Theme-My-Login?
Joe Buckle
1

Deux options au choix:

  1. Utilisez un plugin, par exemple e - mail d'activation de l'utilisateur ou nouvel utilisateur approuver

  2. Codez 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 la placer dans l'e-mail, créer une page dans wordpress qui capte votre paramètre clé (par exemple en utilisant add_shortcode () ),
  • utilisez get_user_meta () pour comparer la clé d'activation avec celle stockée dans la base de données, placez une autre méta-clé utilisateur pour marquer cet utilisateur comme activé s'il réussit,
  • ajoutez une fonction au filtre d' authentification pour empêcher tout utilisateur non activé de se connecter.
s1lv3r
la source
0

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...
}
Dasbairgaya
la source