Formularz resetowania hasła bez użycia pluginu dla WordPressa
Istnieje bardzo wiele wtyczek dla WordPress’a umożliwiających dodanie formularza odzyskiwania hasła bezpośrednio do dowolnego szablonu. Pamiętajmy jednak, że odsyłanie internautów do skryptu WP-Admin nie jest zbyt profesjonalnym rozwiązaniem więc na pewno dobrze by było pokusić się o znacznie lepsze wykonanie tego jakże kluczowego elementu portalu internetowego. Poniżej znajduje się kod strony wyświetlającej formularz umożliwiający odzyskanie hasła, który w naszej witrynie wygląda i działa jak zwykła niczym nie wyróżniająca się podstrona.
Cały skrypt należy zapisać w dowolnym pliku o dowolnej nazwie z rozszerzeniem PHP, a następnie umieścić w katalogu (znajdującym się na serwerze): /wp-content/themes/nazwa_szablonu/page-templates. Kolejnym krokiem jest dodanie nowej strony w Kokpicie WordPress’a oraz wybranie z menu bocznego szablonu o nazwie: Password Reset Template.
Stronie tej możemy również nadać tytuł np. Odzyskaj hasło, Reset hasła… Natomiast tekst, który wpiszecie w edytorze nie zostanie wyświetlony.
<?php /* Template Name: Password Reset Template */ global $wpdb, $user_ID; $view_form = true; function tg_validate_url() { global $post; $page_url = esc_url(get_permalink( $post->ID )); $urlget = strpos($page_url, "?"); if ($urlget === false) $concate = "?"; else $concate = "&"; return $page_url.$concate; } if (!$user_ID) { //block logged in users if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { $reset_key = $_GET['key']; $user_login = $_GET['login']; $user_data = $wpdb->get_row($wpdb->prepare("SELECT ID, user_login, user_email FROM $wpdb->users WHERE user_activation_key = %s AND user_login = %s", $reset_key, $user_login)); $user_login = $user_data->user_login; $user_email = $user_data->user_email; if(!empty($reset_key) && !empty($user_data)) { $new_password = wp_generate_password(7, false); wp_set_password( $new_password, $user_data->ID ); $message = __('Twoje nowe hasło do konta na stronie:') . "\r\n\r\n"; $message .= get_option('siteurl') . "\r\n\r\n"; $message .= sprintf(__('Login: %s'), $user_login) . "\r\n\r\n"; $message .= sprintf(__('Hasło: %s'), $new_password) . "\r\n\r\n"; $message .= __('Teraz możesz się zalogować z nowym hasłem na stronie ') . get_option('siteurl')."/index.php/zaloguj" . "\r\n\r\n"; if ( $message && !wp_mail($user_email, 'Żądanie resetowania hasła', $message) ) { $error = "<span class='error'>Podałeś nieprawidłowy adres e-mail.</span>"; } else { $error = '<span class="success">Twoje hasło zostało zmienione. Sprawdź pocztę.</span>'; $view_form = false; } } else { $error = '<span class="error">Nie prawidłowy klucz.</span>'; $view_form = false; } } if($_POST['action'] == "tg_pwd_reset") { if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { $error = "Coś poszło nie tak..."; } if(empty($_POST['user_input'])) { $error ="<span class='error'>Podaj swój login lub adres e-mail.</span>"; } //We shall SQL escape the input $user_input = $wpdb->escape(trim($_POST['user_input'])); if(strpos($user_input, '@')) { $user_data = get_user_by_email($user_input); if(empty($user_data) || $user_data->caps[administrator] == 1) { $error = "<span class='error'>Podaj prawidłowy adres E-mail!</span>"; } } else { $user_data = get_userdatabylogin($user_input); if(empty($user_data) || $user_data->caps[administrator] == 1) $error = "<span class='error'>Podaj prawidłowy login!</span>"; } $user_login = $user_data->user_login; $user_email = $user_data->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 reset key $key = wp_generate_password(20, false); $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); } //mailing reset details to the user $message = __('Ktoś wygenerował nowe hasło do konta na portalu:') . "\r\n\r\n"; $message .= get_option('siteurl') . "\r\n\r\n"; $message .= sprintf(__('Login: %s'), $user_login) . "\r\n\r\n"; $message .= __('Jeśli to nie ty, zignoruj tę wiadomość.') . "\r\n\r\n"; $message .= __('Aby zresetować hasło, odwiedź następujący adres:') . "\r\n\r\n"; $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; if ( $message && !wp_mail($user_email, 'Resetowanie hasła', $message) ) { $error = "<span class='error'>Podałeś nieprawidłowy login lub adres e-mail.</span>"; } else { $error = "<span class='success'>Właśnie przesłaliśmy do Ciebie e-mail z instrukcją resetowania hasła.</span>"; } } get_header(); ?> <div id="primary" class="site-content"> <div id="content" role="main" > <div class="login"> <h1><?php the_title(); ?></h1> <div class="information"> Proszę wprowadzić swoją nazwę użytkownika lub adres email. Odnośnik pozwalający na utworzenie nowego hasła zostanie wysłany e-mailem. </div> <?php echo $error; ?> <?php if ( $view_form ) { ?> <form id="wp_pass_reset" action="" method="post"> <input type="hidden" name="action" value="tg_pwd_reset" /> <label>Login lub E-mail:</label> <input type="text" class="text" name="user_input" value="" /> <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" /> <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Zresetuj hasło" /> </form> <?php } ?> </div> </div> </div> <?php get_sidebar(); get_footer(); } else { wp_redirect( home_url() ); exit; } ?>
Powyższy kod został opracowany na podstawie artykułu: http://www.tutorialstag.com/wordpress-custom-password-reset-page-template.html.