Programmgesteuertes Senden des Links zum Zurücksetzen des Passworts
7 Antworten
- Stimmen
-
- 2012-08-03
Wenn Sie also den Link zum Zurücksetzen des Passworts sendenmöchten und Zugriff auf die Codebasis haben,können Sie dasfolgende Snippet verwenden undes weitermodifizieren. Tatsächlich handeltes sichbei diesem Code umeine leichtmodifizierte Version von
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"; }
-
Dasfunktioniertbei mirnichtgenau richtig.Ich habeesin einbenutzerdefiniertes Plugineingegeben und aufmeiner Siteplatziert,aberes verursachtein Problem,bei demichmichnicht von der Site abmelden kann,wennich das Plugininstalliere und dann auf "Abmelden" klicke.Irgendwelche Ideen warum?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
Die vorherige Antwort hatbei mirnichtfunktioniert (sagt,dass der Code auf der wp-Anmeldeseite ungültigist),wahrscheinlich weil die Antwort 1,5 Jahre altist undetwasim WP-Codegeändert wurde. Deshalb habeich diesen Codeein wenig aktualisiert (auch von wp-login.php),hieristes:
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>';; }
-
Das hatbei mirgeklappt.Die akzeptierte Antwortfür 3.8.1funktioniertenicht undendetemit einem abgelaufenen Schlüssel.Insbesonderebei der Verarbeitung und Aktualisierung von "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
-
Diese Antwortführte auch zueinem abgelaufenen Linkfürmich undfunktioniertenicht.This answer also resulted in an expired link for me and did not work.
- 1
- 2017-01-05
- carbide20
-
- 2015-08-30
Ich habefestgestellt,dassnach dem Upgrade von WordPress auf Version 4.3 das oben Genanntefürmein benutzerdefiniertes Pluginnichtmehrfunktioniert.Es wirdimmergemeldet,dass der Schlüssel ungültigist.
Ändern:
$hashed = $wp_hasher->HashPassword( $key );
bis
$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
Dies hat das Problemfürmichbehoben. Ich hoffe,es hilftjemand anderem.
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
Keine der obengenannten Antworten hatbei mirfunktioniert,daher habeichin wp-login.phpnach den Standardfunktionen zum Zurücksetzengesucht. Sie verwendeten die Funktionget_password_reset_key ($ userData). Für den Fall,dass sichjemand an die obigen Antworten hält,ist hiermeine Lösung: -
$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
Da die obige Lösungbei mirnichtfunktionierte,habeich den Code des Bhavesh Valageringfügiggeändert.
Ersetzen:
$key = wp_generate_password( 20, false );
Damit:
$key = get_password_reset_key( $user_data );
Und Siemüssen die Aktualisierungsabfragenicht verwenden. Entfernen Sie daher diefolgende Abfrage:
$wpdb->update( $wpdb->users, array( 'user_activation_key' => time().":".$hashed ), array( 'user_login' => $user_login ) );
Viel Spaßbeim Codieren !!!
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
Versuchen Sie dies
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $key ), array( 'user_login' => $user_login ) );
statt
$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user_login ) );
Es hatbei mirfunktioniert (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)
Ich habe diesemanuellerstellte Seite:
... alles scheintin Ordnung zu sein,aberesfunktioniertnicht,wennes voneiner App aus aufgerufen wird. Wennichjedochmanuell
domain.com/forgot-password?user_login=username
besuche,wird der Rücksetzpassgesendet E-Mailgut.