Vérifiez le nom d'utilisateur correct sur le formulaire de connexion personnalisé
-
-
Dans laprécipitation,`username_exists ()`peut-il vous aider d'unemanière ou d'une autre?In a rush, can `username_exists()` help you somehow?
- 0
- 2011-04-13
- Ashfame
-
3 réponses
- votes
-
- 2011-04-13
Le code qu'il aposté dans cetutoriel (très sympa BTW)est leformulaire dumoduleintégré "resetpassword" qui redirige vers le login.phpen cas d'erreur,mais vouspouvez le changeret créer le vôtreen vousbasant sur le originalet ajoutez-le à lapage demodèle,modifiez:
<form method="post" action="<?php echo site_url('wp-login.php?action=lostpassword', 'login_post') ?>" class="wp-user-form"> <div class="username"> <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label> <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" /> </div> <div class="login_fields"> <?php do_action('login_form', 'resetpass'); ?> <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" /> <?php $reset = $_GET['reset']; if($reset == true) { echo '<p>A message will be sent to your email address.</p>'; } ?> <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?reset=true" /> <input type="hidden" name="user-cookie" value="1" /> </div> </form>
à:
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>" class="wp-user-form"> <div class="username"> <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label> <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" /> </div> <div class="login_fields"> <?php do_action('login_form', 'resetpass'); ?> <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" /> <?php if (isset($_POST['reset_pass'])) { global $wpdb; $username = trim($_POST['user_login']); $user_exists = false; if (username_exists($username)) { $user_exists = true; $user_data = get_userdatabylogin($username); } elseif (email_exists($username)) { $user_exists = true; $user = get_user_by_email($username); } else { $error[] = '<p>' . __('Username or Email was not found, try again!') . '</p>'; } if ($user_exists) { $user_login = $user->user_login; $user_email = $user->user_email; // Generate something random for a password... md5'ing current time with a rand salt $key = substr(md5(uniqid(microtime())), 0, 8); // Now insert the new pass md5'd into the db $wpdb->query("UPDATE $wpdb->users SET user_activation_key = '$key' WHERE user_login = '$user_login'"); //create email message $message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n"; $message .= get_option('siteurl') . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key\r\n"; //send email meassage if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message)) $error[] = '<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>'; } if (count($error) > 0) { foreach ($error as $e) { echo $e . '<br/>'; } } else { echo '<p>' . __('A message will be sent to your email address.') . '</p>'; } } ?> <input type="hidden" name="reset_pass" value="1" /> <input type="hidden" name="user-cookie" value="1" /> </div> </form>
The code he posted in that tutorial (very nice BTW) post's the form to the build-in "reset password" module which redirects to the login.php on error, but you can change that and build your own based on the original and add it to the template page, change:
<form method="post" action="<?php echo site_url('wp-login.php?action=lostpassword', 'login_post') ?>" class="wp-user-form"> <div class="username"> <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label> <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" /> </div> <div class="login_fields"> <?php do_action('login_form', 'resetpass'); ?> <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" /> <?php $reset = $_GET['reset']; if($reset == true) { echo '<p>A message will be sent to your email address.</p>'; } ?> <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?reset=true" /> <input type="hidden" name="user-cookie" value="1" /> </div> </form>
to:
<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>" class="wp-user-form"> <div class="username"> <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label> <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" /> </div> <div class="login_fields"> <?php do_action('login_form', 'resetpass'); ?> <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" /> <?php if (isset($_POST['reset_pass'])) { global $wpdb; $username = trim($_POST['user_login']); $user_exists = false; if (username_exists($username)) { $user_exists = true; $user_data = get_userdatabylogin($username); } elseif (email_exists($username)) { $user_exists = true; $user = get_user_by_email($username); } else { $error[] = '<p>' . __('Username or Email was not found, try again!') . '</p>'; } if ($user_exists) { $user_login = $user->user_login; $user_email = $user->user_email; // Generate something random for a password... md5'ing current time with a rand salt $key = substr(md5(uniqid(microtime())), 0, 8); // Now insert the new pass md5'd into the db $wpdb->query("UPDATE $wpdb->users SET user_activation_key = '$key' WHERE user_login = '$user_login'"); //create email message $message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n"; $message .= get_option('siteurl') . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key\r\n"; //send email meassage if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message)) $error[] = '<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>'; } if (count($error) > 0) { foreach ($error as $e) { echo $e . '<br/>'; } } else { echo '<p>' . __('A message will be sent to your email address.') . '</p>'; } } ?> <input type="hidden" name="reset_pass" value="1" /> <input type="hidden" name="user-cookie" value="1" /> </div> </form>
-
ressemblebeaucoup,je vousferai savoir si celafonctionne.looks great, I'll let you know if it works.
- 0
- 2011-04-14
- Pippin
-
Ok,j'ai réussi àfairefonctionner ça àmerveille,avecjuste quelques changements.Il y aeu quelqueserreurs de syntaxeet legénérateur de clémd5ne fonctionnaitpas,j'ai doncpris celui de wp-login.php.J'aijuste unproblèmemaintenant.Quand quelqu'un clique sur l'url dans l'e-mailpour créer unnouveaumot depasse,ilest redirigé vers leformulairepar défaut,doncmaintenantje dois créer unformulairepour cela aussi.Ok, I've gotten this to work great, with just a few changes. There were a couple of syntax errors and the md5 key generator didn't work, so I took the one from wp-login.php. I just have one problem now. When someone clicks the url in the email to create a new password, they're redirected to the default form, so now I need to create a form for that too.
- 1
- 2011-04-15
- Pippin
-
@pippin: le code dugénérateur de clémd5iciest celui de wp-login.php,et commepour la redirection,essayez d'ajouter `& redirect_to=$ _ SERVER ['REQUEST_URI']` au lien dans l'e-mail que vousenvoyez.@pippin: the the md5 key generator code here is the one for wp-login.php, and as for the redirection try adding `&redirect_to=$_SERVER['REQUEST_URI']` to the link in the email you send.
- 0
- 2011-04-15
- Bainternet
-
Mon lien ressemblemaintenant à ceci `$message.=Get_option ('siteurl')."/wp-login.php?action=rp&key=$key&login=$user_login&redirect_to=$ _ SERVER ['REQUEST_URI'] \ r \n"; `,mais ce quiest étrange,c'est que lorsquej'ajoute la & redirection,lemessagene reçoitpasexpédié ...Aussi,n'ai-jepasbesoin de créer unnouveauformulairepour que l'utilisateurentre sonnouveaumot depasseet autres?My link now looks like this `$message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key&login=$user_login&redirect_to=$_SERVER['REQUEST_URI']\r\n";`, but what's weird is that when I add the &redirect, the message doesn't get sent . . . Also, won't I need to make a new form for the user to enter their new password and such in?
- 0
- 2011-04-15
- Pippin
-
Oui,j'ai oublié cela,vous auriezbesoin de créer votrepropreformulairepour réinitialiser lemot depasseet probablement remplacer le lienenvoyé à l'utilisateur vers l'URL actuelle,et enfonction de la clé,vérifiez si c'est l'utilisateuret montrez-lui leformulaire.Yeah i forgot about that, you would need to create your own form to reset the password and probably replace the link that is sent to the user to the current url, and based on the key check if its the user and show him the form.
- 0
- 2011-04-15
- Bainternet
-
ligne 17 `get_user_by ('login',$ user_login);` car `get_userdatabylogin`est obsolète ...line 17 `get_user_by('login', $user_login);` as the `get_userdatabylogin` has been deprecated...
- 0
- 2012-05-15
- Val
-
Jeme rends compte que cette réponseest assez ancienne,je ne suispas sûr de safiabilité.Bien queje suppose que cela devraitfonctionner,je préfèrene pasjouer avec SQL car celapourrait changer à l'avenir.En revanche,je netrouvepas de détails sur les alternatives.I realize this answer is quite old, I'm a bit unsure about its reliability. While I guess it should work, I'd rather not mess with SQL since it may change in the future. On the other hand, I can't find details on alternatives.
- 0
- 2013-02-25
- Christian
-
"pasjouer avec SQL"?son copié dufichier debase rien deplus" not mess with SQL " ? its copied from the core file nothing more
- 0
- 2013-02-25
- Bainternet
-
- 2012-12-07
Voici une versionmise àjour du code de @bainternet avec leserreurs de syntaxe corrigées,la suggestion de @Valet legénérateur de clés de wp-login.php 3.4.2:
global $wpdb; $username = trim($_POST['user_login']); $user_exists = false; // First check by username if ( username_exists( $username ) ){ $user_exists = true; $user = get_user_by('login', $username); } // Then, by e-mail address elseif( email_exists($username) ){ $user_exists = true; $user = get_user_by_email($username); }else{ $error[] = '<p>'.__('Username or Email was not found, try again!').'</p>'; } if ($user_exists){ $user_login = $user->user_login; $user_email = $user->user_email; $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); if ( empty($key) ) { // Generate something random for a key... $key = wp_generate_password(20, false); do_action('retrieve_password_key', $user_login, $key); // Now insert the new md5 key into the db $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); } //create email message $message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n"; $message .= get_option('siteurl') . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "&redirect_to=".urlencode(get_option('siteurl'))."\r\n"; //send email meassage if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message)) $error[] = '<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>'; } if (count($error) > 0 ){ foreach($error as $e){ echo $e . "<br/>"; } }else{ echo '<p>'.__('A message will be sent to your email address.').'</p>'; }
Here is an updated version of the code from @bainternet with the syntax errors corrected, the suggestion by @Val and the key generator from wp-login.php 3.4.2:
global $wpdb; $username = trim($_POST['user_login']); $user_exists = false; // First check by username if ( username_exists( $username ) ){ $user_exists = true; $user = get_user_by('login', $username); } // Then, by e-mail address elseif( email_exists($username) ){ $user_exists = true; $user = get_user_by_email($username); }else{ $error[] = '<p>'.__('Username or Email was not found, try again!').'</p>'; } if ($user_exists){ $user_login = $user->user_login; $user_email = $user->user_email; $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); if ( empty($key) ) { // Generate something random for a key... $key = wp_generate_password(20, false); do_action('retrieve_password_key', $user_login, $key); // Now insert the new md5 key into the db $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); } //create email message $message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n"; $message .= get_option('siteurl') . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "&redirect_to=".urlencode(get_option('siteurl'))."\r\n"; //send email meassage if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message)) $error[] = '<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>'; } if (count($error) > 0 ){ foreach($error as $e){ echo $e . "<br/>"; } }else{ echo '<p>'.__('A message will be sent to your email address.').'</p>'; }
-
- 2015-11-13
Je rencontraistoujours desproblèmes avec la clé de réinitialisationne fonctionnantpas correctement,le lien dans l'e-mailme redirigeait vers lapage de réinitialisation dumot depasse standard avec leparamètre URLindiquant unproblème avec la clé,j'ai donc suivi deplusprès le wp-login .phpet inclus l'objet $ wp_hasher,cela a résolu leproblèmeet la réinitialisation dumot depasse dans l'e-mailfonctionnemaintenant
if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass']))) { // Acccess global properties global $wpdb, $wp_hasher; // Variables $error_pass_reset = array(); $username = (string) trim($_POST['user_login']); $user_exists = (bool) false; // ---- USERNAME OR EMAIL EXISTS ---- // if (username_exists($username)) { $user_exists = (bool) true; $user = (object) get_user_by('login', $username); } // end if else if (email_exists($username)) { $user_exists = (bool) true; $user = (object) get_user_by('email', $username); } // end else if else { $error_pass_reset[] = '<p>Username or Email was not found, please try again.</p>'; } // end else // ---- USER EXISTS ---- // if ($user_exists === (bool) true) { // Variables $user_login = (string) $user -> user_login; $user_email = (string) $user -> user_email; // Generate password reset key if (empty($key)) { $key = (string) wp_generate_password(20, false); do_action('retrieve_password_key', $user_login, $key); // Create the $wp_hasher object if (empty($wp_hasher)) { require_once(ABSPATH . WPINC . '/class-phpass.php'); $wp_hasher = new PasswordHash(8, true); } // Reset key with hasher applied (MD5 has string output) $hashed = (string) time() . ':' . $wp_hasher -> HashPassword($key); // Insert the new key into the database $wpdb -> update( $wpdb -> users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) ); } // end if // Email message $message = (string) 'Someone requested that the password be reset for the following account:' . "\r\n\r\n" . get_option('siteurl') . "\r\n\r\n" . 'Username: ' . $user_login . "\r\n\r\n" . 'If this was a mistake, just ignore this email and nothing will happen.' . "\r\n\r\n" . 'To reset your password, visit the following address:' . "\r\n\r\n" . get_option('siteurl') . '/wp-login.php?action=rp&key=' . $key . '&login=' . $user_login . "\r\n"; // Send email if ((bool) false === wp_mail($user_email, get_option('blogname') . ' Password Reset', $message)) { $error_pass_reset[] = '<p>The e-mail could not be sent at this time.</p>' . "\n"; } // end if } // end if // Send the rest password email do_action('login_form', 'resetpass'); } // end if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass'])))
I was still encountering issues with the reset key not working properly, the link in the email would redirect me to the standard password reset page with the URL parameter indicating a problem with the key, so I more closely followed the wp-login.php file and included the $wp_hasher object, this fixed the problem and the password reset in the email now works
if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass']))) { // Acccess global properties global $wpdb, $wp_hasher; // Variables $error_pass_reset = array(); $username = (string) trim($_POST['user_login']); $user_exists = (bool) false; // ---- USERNAME OR EMAIL EXISTS ---- // if (username_exists($username)) { $user_exists = (bool) true; $user = (object) get_user_by('login', $username); } // end if else if (email_exists($username)) { $user_exists = (bool) true; $user = (object) get_user_by('email', $username); } // end else if else { $error_pass_reset[] = '<p>Username or Email was not found, please try again.</p>'; } // end else // ---- USER EXISTS ---- // if ($user_exists === (bool) true) { // Variables $user_login = (string) $user -> user_login; $user_email = (string) $user -> user_email; // Generate password reset key if (empty($key)) { $key = (string) wp_generate_password(20, false); do_action('retrieve_password_key', $user_login, $key); // Create the $wp_hasher object if (empty($wp_hasher)) { require_once(ABSPATH . WPINC . '/class-phpass.php'); $wp_hasher = new PasswordHash(8, true); } // Reset key with hasher applied (MD5 has string output) $hashed = (string) time() . ':' . $wp_hasher -> HashPassword($key); // Insert the new key into the database $wpdb -> update( $wpdb -> users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) ); } // end if // Email message $message = (string) 'Someone requested that the password be reset for the following account:' . "\r\n\r\n" . get_option('siteurl') . "\r\n\r\n" . 'Username: ' . $user_login . "\r\n\r\n" . 'If this was a mistake, just ignore this email and nothing will happen.' . "\r\n\r\n" . 'To reset your password, visit the following address:' . "\r\n\r\n" . get_option('siteurl') . '/wp-login.php?action=rp&key=' . $key . '&login=' . $user_login . "\r\n"; // Send email if ((bool) false === wp_mail($user_email, get_option('blogname') . ' Password Reset', $message)) { $error_pass_reset[] = '<p>The e-mail could not be sent at this time.</p>' . "\n"; } // end if } // end if // Send the rest password email do_action('login_form', 'resetpass'); } // end if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass'])))
-
Cette réponse avec le code wp_hasherm'a étéextrêmement utile carj'ai créé unmodèle demot depasse oubliépersonnalisé.This answer with the wp_hasher code was extremely useful to me as I have created a custom forgotten password template.
- 0
- 2017-01-31
- Neelam Khan
J'ai utilisé le didacticiel de Jeff Starpour créermonpropreformulaire de connexionpersonnalisé http://digwp.com/2010/12/login-register-password-code/.Celafonctionnetrèsbien,maisj'ai unproblème.Sur leformulaire de réinitialisation dumot depasse,si quelqu'unentre sonnom d'utilisateur demanièreincorrecte (afin qu'ilne soitpas vérifié),ilest renvoyé au wp-login.php? Action=lostpassword avec lemessage d'erreur.
Existe-t-il unmoyen de rediriger versmaproprepage d'erreur?
Merci!