Вопрос или проблема
Я хочу предоставить функциональность пользователю, когда его аккаунт создается в 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, а также проверить, что пароли совпадают и не пустые. Теперь вам нужно понять, как установить этот новый пароль для новых пользователей.
Шаги по реализации функции установки пароля
-
Проверка данных из URL:
Убедитесь, что вы правильно получаете активационный ключ, действие и логин пользователя из URL:if ( isset($_GET['key']) && $_GET['action'] == "rp") { $reset_key = sanitize_text_field($_GET['key']); $user_login = sanitize_text_field($_GET['login']); }
-
Проверка и обработка формы:
Когда пользователь отправляет форму с новым паролем, вы должны проверить корректность введённых данных. Вы уже это сделали, но нам нужно добавить функцию для установки нового пароля. -
Использование функции
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>'; } } // Остальная обработка ошибок }
-
Создание 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 и обработка ошибок обеспечат безопасность и легкость использования этой функции.