Вопрос или проблема
Здравствуйте, я работаю над созданием плагина, который имеет следующую функциональность, как указано ниже
Моя проблема в том, что я застрял на этапе, когда я создал форму регистрации для пользователей, где пользователи смогут успешно зарегистрироваться, после чего они получат электронное письмо, и после этого они станут конечными пользователями, и я также вношу эту запись в отдельную таблицу базы данных. Я также предоставляю администратору возможность одобрить пользователя. Но моя главная проблема заключается в том, как установить сессию для пользователя, который зарегистрировался через мою форму регистрации, когда он вводит данные в форму входа, которую я создал, чтобы они перенаправлялись на свою панель управления.
Для этого я хочу создать сессию. Но решения, которые я нашел в интернете, все говорят создать сессию и установить ее для WP-login
.
Поэтому, пожалуйста, направьте меня правильным путем
Вот код моей пользовательской формы входа
<form method="POST" id="loginform" name="loginform">
<p>
<label for="user_login">Электронная почта<br>
<input type="text" value="" class="input" aria-describedby="login_error" id="user_email" name="log_mail"></label>
</p>
<p>
<label for="user_pass">Пароль<br>
<input type="password" value="" class="input" aria-describedby="login_error" id="user_pass" name="log_pwd"></label>
</p>
<p>
<label for="user_pass">Роль пользователя<br>
<select name="role_select" id="role_select">
<option value="" selected>Выбрать</option>
<option name="simple_user" value="user">Обычный пользователь</option>
<option name="company_user" value="company_user">Пользователь компании</option>
</select></label>
</p>
<p class="forgetmenot"><label for="rememberme"><input type="checkbox" value="forever" id="rememberme" name="rememberme"> Запомнить меня</label></p>
<p class="submit">
<input type="submit" value="Войти" class="button button-primary button-large" id="wp-submit" name="custom_submit">
</p>
</form>
<?php
$c_user_mail = $_POST['log_mail'];
$c_user_role = $_POST['role_select'];
$c_user_pass = $_POST['log_pwd'];
$c_enc_pass = md5($c_user_pass);
global $wpdb;
$wp_path =$_SERVER["DOCUMENT_ROOT"];
require_once($wp_path.'/wp-config.php');
$table_name = $wpdb->prefix . 'final_user_tabel';
echo $sql = "SELECT * FROM " . $table_name . " WHERE (email="$c_user_mail") AND (userrol="$c_user_role")";
$pageposts = $wpdb->get_results($sql, ARRAY_N);
$pass_check = $pageposts[0][4];
$email_check = $pageposts[0][2];
if($c_enc_pass == $pass_check && $c_user_mail == $email_check){}
?>
// АДМИН
$user_id = 1;
require_once (ABSPATH . ‘wp-includes/pluggable.php’);
if (!is_admin())
{
// ДЕМО-ПОЛЬЗОВАТЕЛЬ
$user_id = 6;
}
if ($current_user_id != $user_id)
{
$user = get_user_by(‘id’, $user_id);
if ($user)
{
wp_set_current_user($user_id, $user->user_login);
// wp_set_auth_cookie($user_id);
if (wp_validate_auth_cookie('', 'logged_in') != $user_id)
{
wp_set_auth_cookie($user_id);
}
// do_action('wp_login', $user->user_login);
}
}
.
Ответ или решение
Создание сессии для пользователей, не обладающих правами администратора в WordPress, является важным аспектом развития плагинов. В данной статье мы рассмотрим, как правильно настроить аутентификацию и создать сессию для зарегистрированных пользователей, используя кастомную форму входа.
1. Подготовка к аутентификации
Сначала убедитесь, что у вас правильно настроен процесс регистрации пользователей. После успешной регистрации пользователи должны получать подтверждение по электронной почте и иметь возможность войти в свою учетную запись.
2. Создание формулы входа
Ваш код формы входа выглядит корректно, но давайте немного его оптимизируем и добавим шаги для аутентификации.
<form method="POST" id="loginform" name="loginform">
<p>
<label for="user_login">Email<br>
<input type="text" class="input" id="user_email" name="log_mail" required>
</label>
</p>
<p>
<label for="user_pass">Пароль<br>
<input type="password" class="input" id="user_pass" name="log_pwd" required>
</label>
</p>
<p>
<label for="role_select">Роль пользователя<br>
<select name="role_select" id="role_select" required>
<option value="" selected>Выберите</option>
<option value="user">Обычный пользователь</option>
<option value="company_user">Корпоративный пользователь</option>
</select>
</label>
</p>
<p class="forgetmenot">
<label for="rememberme"><input type="checkbox" id="rememberme" name="rememberme"> Запомнить меня</label>
</p>
<p class="submit">
<input type="submit" value="Войти" class="button button-primary button-large" name="custom_submit">
</p>
</form>
3. Обработка данных формы
После отправки формы нужно обработать введенные данные и создать сессию пользователя. Вот оптимизированный код для обработки:
if (isset($_POST['custom_submit'])) {
$c_user_mail = sanitize_email($_POST['log_mail']);
$c_user_pass = $_POST['log_pwd'];
$c_user_role = $_POST['role_select']; // Не забудьте использовать это значение для проверки ролей.
global $wpdb;
$table_name = $wpdb->prefix . 'final_user_table'; // Убедитесь, что это имя таблицы верное
$sql = $wpdb->prepare("SELECT * FROM $table_name WHERE email = %s AND userrol = %s", $c_user_mail, $c_user_role);
$user_data = $wpdb->get_row($sql);
if ($user_data) {
if (md5($c_user_pass) === $user_data->password) { // Используйте более безопасные hashing алгоритмы
$user_id = $user_data->id; // ID пользователя из таблицы
// Устанавливаем текущего пользователя
wp_set_current_user($user_id);
wp_set_auth_cookie($user_id);
do_action('wp_login', $user_data->user_login);
// Редирект на страницу панель управления
wp_redirect(home_url('/dashboard')); // Измените путь на нужный вам
exit;
} else {
echo "Неверный пароль.";
}
} else {
echo "Пользователь не найден.";
}
}
4. Рекомендации по безопасности
- Не используйте
md5()
для хеширования паролей. Рассмотрите использование функций, предоставляемых WordPress, таких какwp_hash_password()
иwp_check_password()
. - Используйте подготовленные SQL-запросы для предотвращения SQL-инъекций.
- Всегда валидируйте и очищайте входящие данные.
5. Подведение итогов
Создание сессии для пользователей, не обладающих правами администратора, в WordPress требует внимательного подхода к обработке ввода и безопасности. Следуя приведенным рекомендациям, вы сможете обеспечить надежный процесс аутентификации для конечных пользователей вашего плагина.