web-dev-qa-db-fra.com

Vérification du courrier électronique pour les nouveaux utilisateurs

Je voudrais implémenter un plugin qui demande aux nouveaux utilisateurs de répondre à un email, de vérifier leur adresse email, lors de leur inscription. Je suis déjà en train de faire des recherches approfondies sur le codex, mais je suis très novice et j'apprécierais quelques astuces, notamment en ce qui concerne le maintien de l'utilisateur inactif jusqu'à ce qu'il ait vérifié son courrier électronique. Le reste, je pense que je me débrouillerai tout seul.

5
ProfK

J'ai eu un problème très similaire que j'ai résolu l'autre jour. Dans mon cas, je voulais permettre aux utilisateurs de choisir leur propre mot de passe, puis d'activer leur compte par courrier électronique. Il y a beaucoup à cela, alors je vais juste expliquer comment j'ai réalisé la vérification par e-mail.

Tout d'abord, j'ai utilisé user_register (exécuté lorsqu'un utilisateur est enregistré) et créé une clé (par exemple, l'heure hachée, l'adresse électronique de l'utilisateur et une chaîne aléatoire, etc.) et stocké cette clé dans la table usermeta. Cela sera supprimé lorsque l'utilisateur activera son compte.

Pour empêcher un utilisateur non activé de se connecter, j'ai ajouté des vérifications supplémentaires à la connexion, à l'aide de hook authenticate. Par exemple:

Edit Selon les commentaires, le filtre authenticate devrait renvoyer un objet WP_Error en cas d'échec, sinon, renvoie null. wp_authenticate_username_password s'exécute après cette fonction et, s'il est passé, un WP_User object, il n’effectue aucune vérification d’authentification et suppose qu’elles ont été effectuées.

Le code modifié renvoie tout ce qui lui a été transmis, ou un objet WP_Error si la clé d'activation existe (c'est-à-dire que l'utilisateur n'a pas encore activé son compte).} _

add_filter( 'authenticate', 'wpse32218_check_for_key', 10, 3 );
function wpse32218_check_for_key( $user, $username, $password ){
    $user_obj = get_user_by('login', $username );

    if ($username!=''){
        $value = get_user_meta($user->ID, 'confirmed', true);
        if($value!=null){
            $user = new WP_Error( 'denied', __("<strong>ERROR</strong>: You need to activate your account.".$value."") );//create an error
            remove_action('authenticate', 'wp_authenticate_username_password', 20); //key found - don't proceed!
        }
    }
    return $user;
}

(vous pouvez utiliser shake_error_codes pour faire trembler la boîte de connexion si la clé est trouvée si vous aimez: D).

Ensuite, dans votre plug-in, vous devrez remplacer wp_new_user_notification (fonction enfichable présente dans /wp_includes/pluggable.php). Cette fonction envoie l'e-mail au nouvel utilisateur et à l'administrateur.

Copiez la fonction dans votre plugin, à l'intérieur

if ( !function_exists('wp_new_user_notification') ) :
    //Define your wp_new_user_notification function here
endif;

puis adaptez-le pour qu'il récupère et inclue la clé d'activation dans le message à l'utilisateur.

Pour le projet sur lequel je travaillais, j'ai créé un lien à partir de la clé d'activation sur laquelle l'utilisateur pouvait cliquer pour activer son compte. E.g si leur clé était 01234ABCDE: http://www.example.com?confirm=01234ABCDE .

En utilisant le filtre query_vars, j'ai enregistré la variable "confirmer" avec WordPress. Ensuite, avec le filtre template_include, chaque fois que cette variable est définie (par exemple, comme ci-dessus), je redirige l'utilisateur vers confirm.php (un fichier modèle situé dans mon répertoire de thème).

Ce modèle tente de récupérer l'utilisateur avec la clé correspondante. S'il les trouve, il supprime la clé. Ils sont maintenant activés et peuvent se connecter. Si ce n'est pas le cas, un message d'erreur s'affiche (la clé n'existe pas ou le compte a été activé). S'il y a plusieurs utilisateurs avec la même clé d'activation (ils ne devraient pas l'être!), Une erreur est également générée.

10
Stephen Harris