<
  • Главная
Статьи

Создание страницы восстановления пароля WordPress

Опубликовано: 21.01.2018

видео Создание страницы восстановления пароля WordPress

Как изменить страницу входа в админ панель WordPress

На прошлой неделе я уже опубликовал урок о том, как создать собственную форму авторизации в WordPress. Урок был очень простой и, казалось бы, надо идти по увеличению сложности и заняться формой регистрации.. но нет, сейчас мы рассмотрим самую сложную часть, связанную со страницами восстановления пароля — именно страницами, потому что в принципе их две — та, на которой вы вводите свой email и та, на которой вы устанавливаете новый пароль.


Забыл пароль от wordpress или как восстановить доступ к сайту

Однако я в свою очередь сделаю всё возможное, чтобы этот урок упростить.

Небольшая видео-демонстрация того, что мы сейчас будем делать:

На самом деле и тема и сам код довольно интересны, кроме того, я не встречал ещё хороших уроков об этом. Есть один урок на енвато, состоящий из двух частей, каждая из которых в свою очередь состоит из трёх шагов, у меня самого голова кругом пошла, когда я начал там разбираться.


Восстановление пароля Wordpress: быстрый способ изменить пароль админа в PhpMyAdmin

Так что у меня была идея сделать этот пост премиумом , но так как идей и тем для платных постов пока что полно, я передумал.

Ну хватит болтовни, урок состоит из двух шагов, в первом мы создаём шорткод , а во втором — настраиваем редиректы и отправку письма. Весь код можете спокойно отправить в functions.php текущей темы.

Шаг 1. Шорткод для формы восстановления пароля

Прежде всего вставьте этот код.

add_shortcode ( 'misha_custom_passreset' , 'misha_render_pass_reset_form' ) ; // шорткод [misha_custom_passreset] function misha_render_pass_reset_form ( ) { // если пользователь авторизован, просто выводим сообщение и выходим из функции if ( is_user_logged_in ( ) ) { return sprintf ( "Вы уже авторизованы на сайте. <a href=' %s '>Выйти</a>." , wp_logout_url ( ) ) ; } $return = '' ; // переменная, в которую всё будем записывать // обработка ошибок, если вам нужны такие же стили уведомлений, как в видео, CSS-код прикладываю чуть ниже if ( isset ( $_REQUEST [ 'errno' ] ) ) { $errors = explode ( ',' , $_REQUEST [ 'errno' ] ) ; foreach ( $errors as $error ) { switch ( $error ) { case 'empty_username' : $return .= '<p class="errno">Вы не забыли указать свой email?</p>' ; break ; case 'password_reset_empty' : $return .= '<p class="errno">Укажите пароль!</p>' ; break ; case 'password_reset_mismatch' : $return .= '<p class="errno">Пароли не совпадают!</p>' ; break ; case 'invalid_email' : case 'invalidcombo' : $return .= '<p class="errno">На сайте не найдено пользователя с указанным email.</p>' ; break ; } } } // тем, кто пришёл сюда по ссылке из email, показываем форму установки нового пароля if ( isset ( $_REQUEST [ 'login' ] ) && isset ( $_REQUEST [ 'key' ] ) ) { $return .= '<h3>Укажите новый пароль</h3> <form name="resetpassform" id="resetpassform" action="' . site_url ( 'wp-login.php?action=resetpass' ) . '" method="post" autocomplete="off"> <input type="hidden" id="user_login" name="login" value="' . esc_attr ( $_REQUEST [ 'login' ] ) . '" autocomplete="off" /> <input type="hidden" name="key" value="' . esc_attr ( $_REQUEST [ 'key' ] ) . '" /> <p> <label for="pass1">Новый пароль</label> <input type="password" name="pass1" id="pass1" class="input" size="20" value="" autocomplete="off" /> </p> <p> <label for="pass2">Повторите пароль</label> <input type="password" name="pass2" id="pass2" class="input" size="20" value="" autocomplete="off" /> </p> <p class="description">' . wp_get_password_hint ( ) . '</p> <p class="resetpass-submit"> <input type="submit" name="submit" id="resetpass-button" class="button" value="Сбросить" /> </p> </form>' ; // возвращаем форму и выходим из функции return $return ; } // всем остальным - обычная форма сброса пароля (1-й шаг, где указываем email) $return .= ' <h3>Забыли пароль?</h3> <p>Укажите свой email, под которым вы зарегистрированы на сайте и на него будет отправлена информация о восстановлении пароля.</p> <form id="lostpasswordform" action="' . wp_lostpassword_url ( ) . '" method="post"> <p class="form-row"> <label for="user_login">Email</label> <input type="text" name="user_login" id="user_login"> </p> <p class="lostpassword-submit"> <input type="submit" name="submit" class="lostpassword-button" value="Отправить" /> </p> </form>' ; // возвращаем форму и выходим из функции return $return ; }

Если код выше вам понятен, то вы заметили, что у нас будет одна страница WordPress для восстановления пароля — и когда мы указываем email для получения письма, и когда мы задаём новый пароль.

Поэтому теперь уже в админке WordPress переходим в Страницы > Добавить новую и вставляем в неё наш шорткод [misha_custom_passreset].

Если код из этой статьи вас пугает, рекомендую сделать всё 1 в 1, как на скриншоте.

После того, как я разлогинился (вышел из сайта) и перешёл непосредственно на эту страницу, у меня получилось следующее.

Ах да, чуть не забыл про CSS, вот он:

.errno { background-color : #f4f4f4 ; padding : 10px 20px ; border-left : 5px solid #fe0000 ; } .errno .success { border-left-color : #0bb80b ; }

Шаг 2. Редиректы, отправка ссылки на восстановление пароля.

А теперь код поинтереснее, и самое ужасное, что вам придётся настроить его под себя. Шучу, на самом деле ничего страшного тут не будет, единственное, что нужно сделать, это в начале каждой функции поменять ярлыки (slug) URL страницы восстановления пароля и страницы входа ( прошлый урок ) на те значения, которые решили использовать вы.

Если же вы так же создали у себя страницы с ярлыками forgot-pass и login, то вообще ничего менять не нужно.

/* * перенаправляем стандартную форму */ add_action ( 'login_form_lostpassword' , 'misha_pass_reset_redir' ) ; function misha_pass_reset_redir ( ) { // если используете другой ярлык страницы сброса пароля, укажите здесь $forgot_pass_page_slug = '/forgot-pass' ; // если используете другой ярлык страницы входа, укажите здесь $login_page_slug = '/login' ; // если кто-то перешел на страницу сброса пароля // (!) именно перешел, а не отправил формой, // тогда перенаправляем на нашу кастомную страницу сброса пароля if ( 'GET' == $_SERVER [ 'REQUEST_METHOD' ] && !is_user_logged_in ( ) ) { wp_redirect ( site_url ( $forgot_pass_page_slug ) ) ; exit ; } else if ( 'POST' == $_SERVER [ 'REQUEST_METHOD' ] ) { // если же напротив, была отправлена форма // юзаем retrieve_password() // которая отправляет на почту ссылку сброса пароля // пользователю, который указан в $_POST['user_login'] $errors = retrieve_password ( ); if ( is_wp_error ( $errors ) ) { // если возникли ошибки, возвращаем пользователя назад на форму $to = site_url ( $forgot_pass_page_slug ) ; $to = add_query_arg ( 'errno' , join ( ',' , $errors -> get_error_codes ( ) ) , $to ) ; } else { // если ошибок не было, перенаправляем на логин с сообщением об успехе $to = site_url ( $login_page_slug ) ; $to = add_query_arg ( 'errno' , 'confirm' , $to ) ; } // собственно сам редирект wp_redirect ( $to ) ; exit ; } } /* * Манипуляции уже после перехода по ссылке из письма */ add_action ( 'login_form_rp' , 'misha_to_custom_password_reset' ) ; add_action ( 'login_form_resetpass' , 'misha_to_custom_password_reset' ) ; function misha_to_custom_password_reset ( ) { $key = $_REQUEST [ 'key' ] ; $login = $_REQUEST [ 'login' ] ; // если используете другой ярлык страницы сброса пароля, укажите здесь $forgot_pass_page_slug = '/forgot-pass' ; // если используете другой ярлык страницы входа, укажите здесь $login_page_slug = '/login' ; // проверку соответствия ключа и логина проводим в обоих случаях if ( ( 'GET' == $_SERVER [ 'REQUEST_METHOD' ] || 'POST' == $_SERVER [ 'REQUEST_METHOD' ] ) && isset ( $key ) && isset ( $login ) ) { $user = check_password_reset_key ( $key , $login ) ; if ( ! $user || is_wp_error ( $user ) ) { if ( $user && $user -> get_error_code ( ) === 'expired_key' ) { wp_redirect ( site_url ( $login_page_slug . '?errno=expiredkey' ) ) ; } else { wp_redirect ( site_url ( $login_page_slug . '?errno=invalidkey' ) ) ; } exit ; } } if ( 'GET' == $_SERVER [ 'REQUEST_METHOD' ] ) { $to = site_url ( $forgot_pass_page_slug ) ; $to = add_query_arg ( 'login' , esc_attr ( $login ) , $to ) ; $to = add_query_arg ( 'key' , esc_attr ( $key ) , $to ) ; wp_redirect ( $to ) ; exit ; } elseif ( 'POST' == $_SERVER [ 'REQUEST_METHOD' ] ) { if ( isset ( $_POST [ 'pass1' ] ) ) { if ( $_POST [ 'pass1' ] != $_POST [ 'pass2' ] ) { // если пароли не совпадают $to = site_url ( $forgot_pass_page_slug ) ; $to = add_query_arg ( 'key' , esc_attr ( $key ) , $to ) ; $to = add_query_arg ( 'login' , esc_attr ( $login ) , $to ) ; $to = add_query_arg ( 'errno' , 'password_reset_mismatch' , $to ) ; wp_redirect ( $to ) ; exit ; } if ( empty ( $_POST [ 'pass1' ] ) ) { // если поле с паролем пустое $to = site_url ( $forgot_pass_page_slug ) ; $to = add_query_arg ( 'key' , esc_attr ( $key ) , $to ) ; $to = add_query_arg ( 'login' , esc_attr ( $login ) , $to ) ; $to = add_query_arg ( 'errno' , 'password_reset_empty' , $to ) ; wp_redirect ( $to ) ; exit ; } // тут кстати вы можете задать и свои проверки, например, чтобы длина пароля была 8 символов // с паролями всё окей, можно сбрасывать reset_password ( $user , $_POST [ 'pass1' ] ) ; wp_redirect ( site_url ( $login_page_slug . '?errno=changed' ) ) ; } else { // если что-то пошло не так echo "Что-то пошло не так." ; } exit ; } }

Ну вот и всё, ссылки на описание некоторых из используемых функций вы найдёте чуть ниже под статьей. Кроме того, если у вас возник вопрос, вы всегда можете оставить его в комментариях, и он не останется без внимания.

По теме

Изменение страницы входа WordPress. C учётом сообщений об ошибках и редиректов. Стандартная форма авторизации в WP работает прекрасно, однако, если вы работаете над серьезным проектом, вы не захотите её использовать. site_url() — возвращает URL директории установки WordPress Функция возвращает URL директории, в которой установлен WordPress, обычно она совпадает с URL сайта. is_user_logged_in() — проверяет, авторизован ли текущий пользователь Условный тег, проверяет текущего пользователя, залогинен ли он на сайте. add_query_arg() — добавляет параметры в строку URL-вида Позволяет добавить один или несколько параметров в URL-строку, в результате возвращает строку с уже присутствующими в ней параметрами. wp_redirect() — создание редиректов Создание редиректов (перенаправлений) с возможностью указания их статуса (301, 302 и пр.)


Новости
    Без плагина
    На сайте WordPress имеется файл, именуемый как .htaccess. Многие пользователи не предают ему особого внимания и не используют все его возможности. На самом деле файл .htaccess – это дополнительные конфигурации

    Плагин подписки wordpress
    Очень трудно найти один плагин подписки wordpress , который объединил бы в себе все виды подписок, которые так необходимы сайту. Именно поэтому я решил сделать подборку лучших плагинов, которые смогут

    Слайд-шоу с помощью плагина для WordPress UnPointZero Slider
    Плагин для cms WordPress UnPointZero Slider – новостной слайдер. Он отражает в форме слайд-шоу изображения со ссылками на ваши статьи и краткие выдержки оттуда. Его можно установить и на новостной сайт,

    Плагины для Wordpress
    С помощью этого плагина вы легко сможете интегрировать Google диск на ваш WordPress сайт или блог . Gravity Forms — лучший плагин для создания форм на WordPress, от самых простых (например, форма

    Подписки плагином JetPack: размещение и редакция формы подписки
    Вступление Здравствуйте! В этой статье я покажу, как использовать плагин JetPack для создания пользовательской формы подписки и как эту формы подписки плагином JetPack добавлять в статьи сайта, а при

    Чистка сайта WordPress плагином WP-optimize
    От автора Со временем использования система WordPress накапливает не нужные файлы, комментарии и неиспользуемые данные в базе данных. Эти файлы и данные создаются в процессе работы и нужны для этого,

    Возможности Jetpack плагина
    Вступление Возможности Jetpack плагина это более 30 функциональных модуля плагина, делающего его универсальным плагином WordPress, заменяющего аналогичные сторонние плагины. Jetpack один заменяет десятки

    Резервное копирование WordPress сайта без плагинов
    Вступление Резервное копирование WordPress это второе, что нужно научиться делать после установки WordPress. Можно сколько угодно говорить о безопасности сайта и его защите, но лучшего варианта защиты

    Плагины на приват для Майнкрафт ПЕ
    > > Плагины на приват для Майнкрафт ПЕ Порой всем нам хочется попробовать себя в роли администратора сервера и испытать эту ответственность, но, к сожалению, вы не всегда все знаете о создании

    Плагин WordPress Database Backup. Архивация базы данных блога на WordPress
    Привет друзья! Сегодня на очереди еще один простой, НО, необходимый и полезный плагин — плагин WordPress Database Backup , который с легкостью и самостоятельно произведет процесс, который научно называется:

  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью

rss