Envoi du lien de réinitialisation du mot de passe par programme
7 réponses
- votes
-
- 2012-08-03
Donc,si vous voulezenvoyer le lien de réinitialisation dumot depasseet que vous avez accès à labase de code,vouspouvez utiliser l'extrait de code suivantet vouspouvez lemodifier davantage,en fait ce codeest une version légèrementmodifiée de
wp-login.php
/** * Handles sending password retrieval email to user. * * @uses $wpdb WordPress Database object * @param string $user_login User Login or Email * @return bool true on success false on error */ function retrieve_password($user_login) { global $wpdb, $current_site; if ( empty( $user_login) ) { return false; } else if ( strpos( $user_login, '@' ) ) { $user_data = get_user_by( 'email', trim( $user_login ) ); if ( empty( $user_data ) ) return false; } else { $login = trim($user_login); $user_data = get_user_by('login', $login); } do_action('lostpassword_post'); if ( !$user_data ) return false; // redefining user_login ensures we return the right case in the email $user_login = $user_data->user_login; $user_email = $user_data->user_email; do_action('retreive_password', $user_login); // Misspelled and deprecated do_action('retrieve_password', $user_login); $allow = apply_filters('allow_password_reset', true, $user_data->ID); if ( ! $allow ) return false; else if ( is_wp_error($allow) ) return false; $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)); } $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; if ( is_multisite() ) $blogname = $GLOBALS['current_site']->site_name; else // The blogname option is escaped with esc_html on the way into the database in sanitize_option // we want to reverse this for the plain text arena of emails. $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); $title = sprintf( __('[%s] Password Reset'), $blogname ); $title = apply_filters('retrieve_password_title', $title); $message = apply_filters('retrieve_password_message', $message, $key); if ( $message && !wp_mail($user_email, $title, $message) ) wp_die( __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') ); return true; } $user_login = sanitize_text_field( $_GET['user_login'] ); if (retrieve_password($user_login)) { echo "SUCCESS"; } else { echo "ERROR"; }
So if you want to send that the reset password link and you have access to the code base you can use the following snippet and you can modify it further, actually that code is slightly modified version of
wp-login.php
/** * Handles sending password retrieval email to user. * * @uses $wpdb WordPress Database object * @param string $user_login User Login or Email * @return bool true on success false on error */ function retrieve_password($user_login) { global $wpdb, $current_site; if ( empty( $user_login) ) { return false; } else if ( strpos( $user_login, '@' ) ) { $user_data = get_user_by( 'email', trim( $user_login ) ); if ( empty( $user_data ) ) return false; } else { $login = trim($user_login); $user_data = get_user_by('login', $login); } do_action('lostpassword_post'); if ( !$user_data ) return false; // redefining user_login ensures we return the right case in the email $user_login = $user_data->user_login; $user_email = $user_data->user_email; do_action('retreive_password', $user_login); // Misspelled and deprecated do_action('retrieve_password', $user_login); $allow = apply_filters('allow_password_reset', true, $user_data->ID); if ( ! $allow ) return false; else if ( is_wp_error($allow) ) return false; $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)); } $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; if ( is_multisite() ) $blogname = $GLOBALS['current_site']->site_name; else // The blogname option is escaped with esc_html on the way into the database in sanitize_option // we want to reverse this for the plain text arena of emails. $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); $title = sprintf( __('[%s] Password Reset'), $blogname ); $title = apply_filters('retrieve_password_title', $title); $message = apply_filters('retrieve_password_message', $message, $key); if ( $message && !wp_mail($user_email, $title, $message) ) wp_die( __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') ); return true; } $user_login = sanitize_text_field( $_GET['user_login'] ); if (retrieve_password($user_login)) { echo "SUCCESS"; } else { echo "ERROR"; }
-
Celane fonctionnepasexactementpourmoi.Je l'aientré dans unpluginpersonnaliséet je l'aimis surmon site,mais celapose unproblème où lorsquej'installe leplugin,puis queje clique sur `` Déconnexion '',celane me déconnectepas du site.Desidéespourquoi?This isn't working for me exactly right. I've entered it into a custom plugin and put it on my site but it's causing an issue where when I install the plugin and then click 'Logout' it won't log me out of the site. Any ideas why?
- 0
- 2013-10-11
- MxmastaMills
-
- 2014-03-10
La réponseprécédenten'apasfonctionnépourmoi (dit que le codeestinvalide,sur lapage de connexion wp),probablementparce que la réponse a 1,5 anset que quelque chose a changé dans le code WP,j'ai doncmis àjour ce code unpeu (également de wp-login.php),le voici:
function retrieve_password($user_login){ global $wpdb, $wp_hasher; $user_login = sanitize_text_field($user_login); if ( empty( $user_login) ) { return false; } else if ( strpos( $user_login, '@' ) ) { $user_data = get_user_by( 'email', trim( $user_login ) ); if ( empty( $user_data ) ) return false; } else { $login = trim($user_login); $user_data = get_user_by('login', $login); } do_action('lostpassword_post'); if ( !$user_data ) return false; // redefining user_login ensures we return the right case in the email $user_login = $user_data->user_login; $user_email = $user_data->user_email; do_action('retreive_password', $user_login); // Misspelled and deprecated do_action('retrieve_password', $user_login); $allow = apply_filters('allow_password_reset', true, $user_data->ID); if ( ! $allow ) return false; else if ( is_wp_error($allow) ) return false; $key = wp_generate_password( 20, false ); do_action( 'retrieve_password_key', $user_login, $key ); if ( empty( $wp_hasher ) ) { require_once ABSPATH . 'wp-includes/class-phpass.php'; $wp_hasher = new PasswordHash( 8, true ); } $hashed = $wp_hasher->HashPassword( $key ); $wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) ); $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; if ( is_multisite() ) $blogname = $GLOBALS['current_site']->site_name; else $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); $title = sprintf( __('[%s] Password Reset'), $blogname ); $title = apply_filters('retrieve_password_title', $title); $message = apply_filters('retrieve_password_message', $message, $key); if ( $message && !wp_mail($user_email, $title, $message) ) wp_die( __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') ); echo '<p>Link for password reset has been emailed to you. Please check your email.</p>';; }
Previous answer didn't worked for me (says that code is invalid, on wp login page), probably because answer is 1,5 yr old, and something is changed in WP code, so I have updated this code a bit (also from wp-login.php), here it is:
function retrieve_password($user_login){ global $wpdb, $wp_hasher; $user_login = sanitize_text_field($user_login); if ( empty( $user_login) ) { return false; } else if ( strpos( $user_login, '@' ) ) { $user_data = get_user_by( 'email', trim( $user_login ) ); if ( empty( $user_data ) ) return false; } else { $login = trim($user_login); $user_data = get_user_by('login', $login); } do_action('lostpassword_post'); if ( !$user_data ) return false; // redefining user_login ensures we return the right case in the email $user_login = $user_data->user_login; $user_email = $user_data->user_email; do_action('retreive_password', $user_login); // Misspelled and deprecated do_action('retrieve_password', $user_login); $allow = apply_filters('allow_password_reset', true, $user_data->ID); if ( ! $allow ) return false; else if ( is_wp_error($allow) ) return false; $key = wp_generate_password( 20, false ); do_action( 'retrieve_password_key', $user_login, $key ); if ( empty( $wp_hasher ) ) { require_once ABSPATH . 'wp-includes/class-phpass.php'; $wp_hasher = new PasswordHash( 8, true ); } $hashed = $wp_hasher->HashPassword( $key ); $wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) ); $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; if ( is_multisite() ) $blogname = $GLOBALS['current_site']->site_name; else $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); $title = sprintf( __('[%s] Password Reset'), $blogname ); $title = apply_filters('retrieve_password_title', $title); $message = apply_filters('retrieve_password_message', $message, $key); if ( $message && !wp_mail($user_email, $title, $message) ) wp_die( __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') ); echo '<p>Link for password reset has been emailed to you. Please check your email.</p>';; }
-
Cela afonctionnépourmoi.La réponse acceptéepour 3.8.1n'apasfonctionnéet s'estterminéepar une cléexpirée.Plusprécisément,dans letraitement de «$ key»et lamise àjour de «user_activation_key».This worked out for me. The accepted answer for 3.8.1 did not worked and ended in expired key. Specifically, in `$key` processing and updating `user_activation_key`.
- 0
- 2014-03-27
- Rolice
-
Cette réponse a égalemententraîné un lienexpirépourmoiet n'apasfonctionné.This answer also resulted in an expired link for me and did not work.
- 1
- 2017-01-05
- carbide20
-
- 2015-08-30
J'ai remarqué qu'après lamise àniveau de WordPress vers la version 4.3,ce quiprécèdene fonctionnaitpluspourmonpluginpersonnalisé.Il signaletoujours que la clén'estpas valide.
Modifier:
$hashed = $wp_hasher->HashPassword( $key );
à
$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
Cela a résolu leproblèmepourmoi,j'espère que cela aidera quelqu'un d'autre
I noticed that after upgrading WordPress to Version 4.3 that the above no longer worked for my custom plugin. It would always report that the key was invalid.
Change:
$hashed = $wp_hasher->HashPassword( $key );
to
$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
This fixed the issue for me, hope it helps someone else
-
- 2017-07-31
Aucune des réponses ci-dessusn'afonctionnépourmoi,alorsj'ai regardé dans wp-login.phppour leurfonctionnalité de réinitialisationpar défaut. Ils ont utilisé lafonctionget_password_reset_key ($ userData). Au cas où quelqu'un resterait sur les réponses ci-dessus,voicima solution: -
$userData = get_userdata($user_id); $user_login = $userData->user_login; $user_email = $userData->user_email; $key = get_password_reset_key( $userData ); $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');
None of the above answer worked for me so I looked into wp-login.php for their default reset functionality. They used get_password_reset_key( $userData ) function . In case someone stuck up on above answers here's my solution :-
$userData = get_userdata($user_id); $user_login = $userData->user_login; $user_email = $userData->user_email; $key = get_password_reset_key( $userData ); $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');
-
- 2015-12-08
Wordpress 4.3.1
function retrieve_password($user_login){ global $wpdb, $wp_hasher; $user_login = sanitize_text_field($user_login); if ( empty( $user_login) ) { return false; } else if ( strpos( $user_login, '@' ) ) { $user_data = get_user_by( 'email', trim( $user_login ) ); if ( empty( $user_data ) ) return false; } else { $login = trim($user_login); $user_data = get_user_by('login', $login); } do_action('lostpassword_post'); if ( !$user_data ) return false; // redefining user_login ensures we return the right case in the email $user_login = $user_data->user_login; $user_email = $user_data->user_email; do_action('retreive_password', $user_login); // Misspelled and deprecated do_action('retrieve_password', $user_login); $allow = apply_filters('allow_password_reset', true, $user_data->ID); if ( ! $allow ) return false; else if ( is_wp_error($allow) ) return false; $key = wp_generate_password( 20, false ); do_action( 'retrieve_password_key', $user_login, $key ); if ( empty( $wp_hasher ) ) { require_once ABSPATH . 'wp-includes/class-phpass.php'; $wp_hasher = new PasswordHash( 8, true ); } $hashed = $wp_hasher->HashPassword( $key ); $wpdb->update( $wpdb->users, array( 'user_activation_key' => time().":".$hashed ), array( 'user_login' => $user_login ) ); $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; if ( is_multisite() ) $blogname = $GLOBALS['current_site']->site_name; else $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); $title = sprintf( __('[%s] Password Reset'), $blogname ); $title = apply_filters('retrieve_password_title', $title); $message = apply_filters('retrieve_password_message', $message, $key); if ( $message && !wp_mail($user_email, $title, $message) ) wp_die( __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') ); echo '<p>Link for password reset has been emailed to you. Please check your email.</p>';; }
Wordpress 4.3.1
function retrieve_password($user_login){ global $wpdb, $wp_hasher; $user_login = sanitize_text_field($user_login); if ( empty( $user_login) ) { return false; } else if ( strpos( $user_login, '@' ) ) { $user_data = get_user_by( 'email', trim( $user_login ) ); if ( empty( $user_data ) ) return false; } else { $login = trim($user_login); $user_data = get_user_by('login', $login); } do_action('lostpassword_post'); if ( !$user_data ) return false; // redefining user_login ensures we return the right case in the email $user_login = $user_data->user_login; $user_email = $user_data->user_email; do_action('retreive_password', $user_login); // Misspelled and deprecated do_action('retrieve_password', $user_login); $allow = apply_filters('allow_password_reset', true, $user_data->ID); if ( ! $allow ) return false; else if ( is_wp_error($allow) ) return false; $key = wp_generate_password( 20, false ); do_action( 'retrieve_password_key', $user_login, $key ); if ( empty( $wp_hasher ) ) { require_once ABSPATH . 'wp-includes/class-phpass.php'; $wp_hasher = new PasswordHash( 8, true ); } $hashed = $wp_hasher->HashPassword( $key ); $wpdb->update( $wpdb->users, array( 'user_activation_key' => time().":".$hashed ), array( 'user_login' => $user_login ) ); $message = __('Someone requested that the password be reset for the following account:') . "\r\n\r\n"; $message .= network_home_url( '/' ) . "\r\n\r\n"; $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n"; $message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n"; $message .= __('To reset your password, visit the following address:') . "\r\n\r\n"; $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n"; if ( is_multisite() ) $blogname = $GLOBALS['current_site']->site_name; else $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); $title = sprintf( __('[%s] Password Reset'), $blogname ); $title = apply_filters('retrieve_password_title', $title); $message = apply_filters('retrieve_password_message', $message, $key); if ( $message && !wp_mail($user_email, $title, $message) ) wp_die( __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') ); echo '<p>Link for password reset has been emailed to you. Please check your email.</p>';; }
-
- 2020-02-20
Comme la solution ci-dessusne fonctionnaitpaspourmoi,j'ai apporté desmodificationsmineures au code dubhavesh vala.
Remplacer:
$key = wp_generate_password( 20, false );
Avec ceci:
$key = get_password_reset_key( $user_data );
Et vousn'avezpasbesoin d'utiliser la requête demise àjour,supprimez donc la requête ci-dessous:
$wpdb->update( $wpdb->users, array( 'user_activation_key' => time().":".$hashed ), array( 'user_login' => $user_login ) );
Bon codage !!!
Since the above solution was not working for me I did a minor changes in the bhavesh vala's code.
Replace :
$key = wp_generate_password( 20, false );
With this :
$key = get_password_reset_key( $user_data );
And you don't need to use the update query, so remove the below query :
$wpdb->update( $wpdb->users, array( 'user_activation_key' => time().":".$hashed ), array( 'user_login' => $user_login ) );
Happy coding!!!
-
- 2015-10-23
Essayez ceci
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $key ), array( 'user_login' => $user_login ) );
au lieu de
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) );
Celam'afonctionné (wordpress 4.3.1)
Try this
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $key ), array( 'user_login' => $user_login ) );
instead of
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) );
It worked me (wordpress 4.3.1)
J'ai cettepage crééemanuellement:
...tout semble correctmais celane fonctionnepas lorsqu'ilest appelé depuis une application,mais sije visitemanuellement
domain.com/forgot-password?user_login=username
,ilenvoie lemot depasse de réinitialisatione-mailtrèsbien.