Кастомная страница со сменой пароля авторизованного пользователя

Сразу скажу что убрал доступ к 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> 
→ Ссылка