Кастомная страница со сменой пароля авторизованного пользователя
Сразу скажу что убрал доступ к wp admin. Создал свою кастомную страницу и создал php файл собственно подвязал к странице через шорткод.
Теперь нужно реализовать смену пароля. Какая функция отвечает в движке wordpress за смену пароля ? Не знаю можно ли использовать такие функции как wp_set_password() и password_reset хук
Ответы (3 шт):
Автор решения: KodimWeb
→ Ссылка
Добрый день предоставляю вам готовый листинг кода для кастомной страницы смены пароля:
<?php
/*
Template Name: Шаблон сброс пароля
Template Post Type: page
*/
/**
* The template for displaying all pages
*
* This is the template that displays all pages by default.
* Please note that this is the WordPress construct of pages
* and that other 'pages' on your WordPress site may use a
* different template.
*
* @link https://developer.wordpress.org/themes/basics/template-hierarchy/
*
* @package exemple
*/
$error = array();
if ( $_POST && isset ( $_POST['submit'] ) ) {
$email = esc_sql( $_POST['email'] );
$nonce = esc_sql( $_POST['nonce'] );
if ( !wp_verify_nonce( $nonce, 'nonograms' ) ) {
$error['empty_nonce'] = 'Ошибка запроса';
}
if ( empty( $email ) ) {
$error['empty_fields'] = 'Заполните поле Email';
}
if ( !is_email( $email ) ) {
$error['email_invalid'] = 'Неправильный Email';
}
$user = get_user_by( 'email', $email );
if ( !$user ) {
$error['no_user'] = 'Пользователь с указанными данными не зарегистрирован';
}
if ( count( $error) > 0 ) {
$error['class'] = 'errors';
} else {
$key = get_password_reset_key( $user );
$url = get_site_url( null, 'new-pass/?key=' . $key . '&login=' . $user->data->user_login );
$subject = 'Запрос на сброс пароля: ';
$headers = array(
'From: ' . get_bloginfo( 'name' ) . ' <' . get_bloginfo( 'admin_email' ) . '>',
'content-type: text/html',
);
$message = "<p>Кто-то запросил сброс пароля для следующей учётной записи:</p><p>Название сайта: " . get_bloginfo( 'name' ) . "</p><p>Имя пользователя: " . $user->data->user_login . "</p><p>Если произошла ошибка, просто проигнорируйте это письмо, и ничего не произойдёт.</p><p>Чтобы сбросить пароль, перейдите по следующей ссылке: <a href='" . $url . "' target='blank'>Восстановить пароль</a></p><p>Данное письмо сгенерировано автоматически. Отвечать на него не надо.<br>Спасибо.</p>";
wp_mail( $email, $subject, $message, $headers );
$error['error_send_mail'] = 'На указанную вами почту отправлено письмо с инструкциями';
$error['class'] = 'error_plus';
}
}
if ( $_GET && isset( $_GET['key'] ) && isset( $_GET['login'] ) ) {
$key = esc_sql( $_GET['key'] );
$login = esc_sql( $_GET['login'] );
$check = check_password_reset_key( $_GET['key'], $_GET['login'] );
if ( is_wp_error( $check ) ) {
$error['invalid_link'] = 'Ссылка не действительна';
$error['class'] = 'errors';
$showForm = false;
} else {
if ( $_POST && isset ( $_POST['submit_2'] ) ) {
$passNew = esc_sql( $_POST['password'] );
$passConf = esc_sql( $_POST['password_confirm'] );
if ( empty( $passNew ) || empty( $passConf ) ) {
$error['empty_fields'] = 'Не все поля заполнены';
}
if ( $passNew !== $passConf ) {
$error['passwords_not_equal'] = 'Пароли не совпадают';
}
if ( 6 > strlen( $passNew ) ) {
$error['short_password'] = 'Короткий пароль. Минимум 6 символов';
}
if ( count( $error ) > 0 ) {
$error['class'] = 'errors';
} else {
$user = get_user_by( 'login', $login );
wp_set_password( $passNew, $user->ID );
$_SESSION['error_class'] = 'error_plus';
$_SESSION['error_login'][] = 'Поздравляем! Пароль сменен';
$_SESSION['error_login'][] = 'Теперь можно зайти на сайт';
wp_redirect( get_site_url( null, 'login/' ), 301 );
exit;
}
}
$showForm = true;
}
} else {
$showForm = false;
}
get_header();
?>
<div class="page__wrap">
<?php get_sidebar(); ?>
<main class="site-main">
<?php
while ( have_posts() ) :
the_post();
?>
<div class="content">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
<?php if ( count( $error ) > 0 ) { ?>
<div class="<?= $error['class']; unset( $error['class'] ); ?>">
<?php foreach ( $error as $err ) { ?>
<div class="error_elem"><?= $err; ?></div>
<?php } ?>
</div>
<?php } ?>
<?php if ( !$showForm ) { ?>
<p>Укажите свой email, под которым вы зарегистрированы, и на него будет отправлена информация о восстановлении пароля.</p>
<form action="" method="post">
<div class="input_wrap">
<label for="user_email">Email</label>
<input type="email" name="email" id="user_email" value="<?= isset( $_POST['email'] ) ? $email : null; ?>" required/>
<?php wp_nonce_field( 'nonograms','nonce', false ); ?>
</div>
<input type="submit" name="submit" value="Отправить">
</form>
<?php } else { ?>
<form action="" method="post">
<div class="input_wrap">
<label for="user_pass">Новый пароль</label>
<input type="password" name="password" id="user_pass" required/>
</div>
<div class="input_wrap">
<label for="user_pass_confirm">Повторите пароль</label>
<input type="password" name="password_confirm" id="user_pass_confirm" required/>
</div>
<input type="submit" name="submit_2" value="Отправить">
</form>
<?php } ?>
</div>
<?php
endwhile; // End of the loop.
?>
</main><!-- #main -->
</div>
<?php
get_footer();
Автор решения: Misha Jaglovskiy
→ Ссылка
Попробуйте посмотреть видео https://www.youtube.com/watch?v=6X9Hs2jNu2w&t=163s
Я, конечно же, понимаю что это не совсем то что вам нужно, но мне кажется, что вы сможете вычленить нужную вам информацию из данного видео
Автор решения: Tand
→ Ссылка
<?php
$current_user = wp_get_current_user();
$user = $current_user->ID;
$new_pass=$_POST['pass2'];
if($user && isset($new_pass))
{
echo "Вы успешно сменили пароль";
wp_set_password( $new_pass, $user);
}
?>
<form method="post" action="http://Тут редирект прописать на текущую страницу вашего сайта">
<input name="pass2">
<input type="submit" value='Сменить'>
</form>