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

9

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

En gros, 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 que j'ai besoin de faire, c'est plutôt que d'envoyer l'e-mail de confirmation, ce que je sais pouvoir faire avec le code suivant.

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

Je souhaite plutôt envoyer un e-mail 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 ait déjà eu ce problème auparavant.

    
posée Joe Buckle 11.10.2013 - 14:45

3 réponses

9

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. envoyez 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, ne le connectez pas et affichez un message d'erreur d'activation.

Ajouter un champ personnalisé et envoyer un courrier électronique:

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.

    
réponse donnée Eugene Manuilov 11.10.2013 - 15:42
1

Deux options au choix:

  1. Utilisez un plugin, par exemple Courriel d'activation d'utilisateur ou Nouveau approbation de l'utilisateur

  2. Codez ceci vous-même.

Certaines fonctions qui devraient vous aider à démarrer:

  • wp_mail () pour envoyer le courrier électronique,
  • add_user_meta () pour enregistrer une clé d'activation pour l'utilisateur,
  • générez un lien contenant la clé et placez-le dans l'e-mail, créez une page dans wordpress qui capture votre clé-param (par exemple, à l'aide de 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 d'utilisateur marquer cet utilisateur comme activé si réussi,
  • ajoutez une fonction au filtre authentifier pour empêcher tout utilisateur non activé de se connecter.
réponse donnée s1lv3r 11.10.2013 - 15:47
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...
}
    
réponse donnée Dasbairgaya 16.05.2017 - 10:03

Lire d'autres questions sur les étiquettes