Как установить пароль с фронтенда, если есть ключ активации и логин пользователя в URL в WordPress?

Вопрос или проблема

Я хочу предоставить функциональность пользователю, когда его аккаунт создается в WordPress администратором. В это время на почту пользователя отправляется электронное письмо с установленным паролем, которое содержит ссылку на кастомную страницу с ключом активации, логином и действием. Я создал один шорткод, который используется на странице для установки пароля с фронтенда. Мне удалось получить данные из URL и проверить, соответствует ли пароль и не пуст ли он, но как я могу установить этот пароль для новых пользователей. Любая помощь/предложение будет оценена.

add_shortcode( 'RESET_PASSWORD' , 'reset_password_function' );
function reset_password_function() { 
    global $wpdb, $user_ID;

    if(isset($_GET['key']) && $_GET['action'] == "rp") {
        $reset_key  = $_GET['key'];
        $action     = $_GET['action'];
        $user_login = $_GET['login'];
        print_r($reset_key);
        echo '<br/>';
        print_r($action); 
        echo '<br/>';
        print_r($user_login); 

        // Выводить результат как
        // Kdfd3434Kdfrewfpd
        // rp
        // [email protected]
    }

    if($_POST['action'] == "agent_pwd_reset"){
        $error = array();

        if(empty($_POST['new_password'])) {
            $error[] = __('Нельзя установить пустое поле нового пароля','AA');
        } else {
            $agent_new_pass = $_POST['new_password'];
        }

        if(empty($_POST['confirm_password'])) {
            $error[] = __('Нельзя установить пустое поле подтверждения пароля','AA');
        } elseif ($_POST['new_password'] !== $_POST['confirm_password']) {
            $error[] = __('Пароли не совпадают.','AA');
        } else {
            $agent_confrim_pass = $_POST['confirm_password'];
            $success = __('Пароли совпадают.','AA');
        }

        if ( count($error) == 0 ) {
            echo '<div class="col-md-6 col-md-offset-4 alert alert-success">'.$success. '</div>'; 
            // здесь я хочу установить новый пароль для пользователя
        } elseif ( count($error) > 0 ) {
            echo '<div class="col-md-6 col-md-offset-4 alert alert-danger error">' . implode("<br />", $error) . '</div>'; 
        }

    }
?>
    <div class="row">
       <div class="col-md-6 col-md-offset-3">
            <form class="form-horizontal password_reset_form" method="post" action="">
                <div class="form-group"> 
                    <label class="control-label col-sm-4" for="new_password">
                        <?php _e('Новый пароль', 'AA'); ?>
                    </label>
                    <div class="col-sm-8">
                        <input type="password" class="form-control" name="new_password" id="new_password" required value="" />
                    </div>
                </div>

                <div class="form-group"> 
                    <label class="control-label col-sm-4" for="confirm_password">
                        <?php _e('Подтвердите пароль', 'AA'); ?>
                    </label>
                    <div class="col-sm-8">
                        <input type="password" class="form-control" name="confirm_password" required id="confirm_password" value="" />
                    </div>
                </div>

                <input type="hidden" name="action" value="agent_pwd_reset" />

                <input type="hidden" name="reset_pass_nonce" value="<?php echo wp_create_nonce("reset_pass_nonce"); ?>" />

                <div class="form-group"> 
                    <div class="col-sm-8 col-sm-offset-4">
                        <input name="resetbtn" type="submit" id="resetbtn" class="resetbtn btn btn-primary" value="<?php _e('Сбросить пароль', 'AA'); ?>" />
                    </div>
                </div>

            </form>
        </div>
    </div>

<?php 
}

Функция, которая вам нужна, это wp_set_password( $_POST['new_password'], $user_ID)

Это обновит пользователя с новым паролем.

Ответ или решение

Как установить пароль через фронтенд при наличии активационного ключа и логина пользователя в WordPress

Ваша задача заключается в том, чтобы дать пользователям возможность установить новый пароль через специальную страницу после того, как администратор создал их аккаунты в WordPress. Вы уже разработали шорткод и смогли получить данные из URL, а также проверить, что пароли совпадают и не пустые. Теперь вам нужно понять, как установить этот новый пароль для новых пользователей.

Шаги по реализации функции установки пароля

  1. Проверка данных из URL:
    Убедитесь, что вы правильно получаете активационный ключ, действие и логин пользователя из URL:

    if ( isset($_GET['key']) && $_GET['action'] == "rp") {
       $reset_key  = sanitize_text_field($_GET['key']);
       $user_login = sanitize_text_field($_GET['login']);
    }
  2. Проверка и обработка формы:
    Когда пользователь отправляет форму с новым паролем, вы должны проверить корректность введённых данных. Вы уже это сделали, но нам нужно добавить функцию для установки нового пароля.

  3. Использование функции wp_set_password:
    Для установки нового пароля WordPress предоставляет функцию wp_set_password(). Она принимает два параметра: пароль и ID пользователя. Вам нужно будет получить ID пользователя на основе логина.

    Вот как можно реализовать это в вашем коде:

    if($_POST['action'] == "agent_pwd_reset"){
       // Ваши проверки на пустые поля и совпадение паролей
    
       if ( count($error) == 0 ) {
           // Получение объекта пользователя по логину
           $user = get_user_by('login', $user_login);
           if ($user) {
               // Установка нового пароля
               wp_set_password($_POST['new_password'], $user->ID);
               echo '<div class="col-md-6 col-md-offset-4 alert alert-success">'.__('Пароль успешно установлен.','AA').'</div>';
           } else {
               echo '<div class="col-md-6 col-md-offset-4 alert alert-danger">'.__('Пользователь не найден.','AA').'</div>';
           }
       } 
       // Остальная обработка ошибок
    }
  4. Создание nonce для защиты от CSRF:
    Для безопасности рекомендуется использовать nonce, чтобы предотвратить Cross-Site Request Forgery. Вы включили nonce в форму, и его нужно проверять перед установкой пароля.

    В начале вашего обработчика добавьте следующее:

    if ( !isset($_POST['reset_pass_nonce']) || !wp_verify_nonce($_POST['reset_pass_nonce'], 'reset_pass_nonce') ) {
       die(__('Безопасность нарушена.','AA'));
    }

Пример финального кода

Вот как может выглядеть финальная версия вашей функции создания шорткода:

add_shortcode('RESET_PASSWORD', 'reset_password_function');

function reset_password_function() { 
    global $wpdb;

    if (isset($_GET['key']) && $_GET['action'] == "rp") {
        $reset_key = sanitize_text_field($_GET['key']);
        $user_login = sanitize_text_field($_GET['login']);
    }

    if ($_POST['action'] == "agent_pwd_reset") {
        $error = array();

        if (empty($_POST['new_password'])) {
            $error[] = __('Поле нового пароля не может быть пустым', 'AA');
        } else {
            $agent_new_pass = $_POST['new_password'];
        }

        if (empty($_POST['confirm_password'])) {
            $error[] = __('Поле подтверждения пароля не может быть пустым', 'AA');
        } elseif ($_POST['new_password'] !== $_POST['confirm_password']) {
            $error[] = __('Пароли не совпадают.', 'AA');
        }

        if (count($error) == 0) {
            if ( ! isset($_POST['reset_pass_nonce']) || ! wp_verify_nonce($_POST['reset_pass_nonce'], 'reset_pass_nonce') ) {
                die(__('Безопасность нарушена.','AA'));
            }

            $user = get_user_by('login', $user_login);
            if ($user) {
                wp_set_password($_POST['new_password'], $user->ID);
                echo '<div class="col-md-6 col-md-offset-4 alert alert-success">'.__('Пароль успешно установлен.','AA').'</div>';
            } else {
                echo '<div class="col-md-6 col-md-offset-4 alert alert-danger">'.__('Пользователь не найден.','AA').'</div>';
            }
        } elseif (count($error) > 0) {
            echo '<div class="col-md-6 col-md-offset-4 alert alert-danger error">'.implode("<br />", $error).'</div>'; 
        }
    }

    // Ваш HTML код формы
}

Заключение

Теперь у вас есть вся необходимая информация для реализации функции установки пароля для пользователей через шорткод в WordPress. Применение верификации nonce и обработка ошибок обеспечат безопасность и легкость использования этой функции.

Оцените материал
Добавить комментарий

Капча загружается...