Содержание статьи
Используйте wp_login_form()
, если нужно быстро внедрить интерфейс входа в произвольный шаблон. Параметры этого хука позволяют отключить лишние поля и встроить результат в любой layout. Пример:
<?php wp_login_form([
\'redirect\' => home_url(),
\'label_username\' => \'Ваш логин\',
\'label_password\' => \'Пароль\',
\'label_log_in\' => \'Войти\',
]); ?>
Если требуется полностью избавиться от стандартной схемы, зарегистрируйте собственный обработчик с помощью add_action(\'init\')
и функции wp_signon()
. Это позволяет контролировать каждый этап: от валидации до редиректа. Не забудьте обрабатывать wp_nonce_field()
для безопасности.
Важно: Никогда не отправляйте пароли без
wp_verify_nonce()
. Это дыра.
Для обработки регистрационных данных обойдите wp_create_user()
стороной, если нужен контроль над ролями и метаданными. Лучше использовать wp_insert_user()
– он дает больше гибкости. Пример:
$user_id = wp_insert_user([
\'user_login\' => $_POST[\'login\'],
\'user_pass\' => $_POST[\'password\'],
\'user_email\' => $_POST[\'email\'],
\'role\' => \'subscriber\'
]);
Ни одного виджета, ни одной строки в functions.php
не должно остаться необоснованной. Если вы отдаете управление шаблонам – ответственность полностью на вас. Страница с логотипом проекта, кастомными полями и переопределением уведомлений через wp_mail()
? Добро пожаловать в зону прямого вмешательства.
if ( is_user_logged_in() ) {
wp_redirect( home_url(\'/dashboard\') );
exit;
}
Внимание! Страница с авторизацией не должна кешироваться. Никогда. Отключите кеш на уровне сервера или через заголовки.
Обработка ошибок – отдельный ад. Стандартный wp_error()
малоинформативен. Лучше сохранять ошибки в $_SESSION
или передавать через GET-параметры с последующей проверкой в шаблоне. Не забудьте удалить их после отображения, иначе они останутся вечно.
Подключение пользовательских форм через шорткоды и функции темы
Размещайте HTML-структуру интерфейса через шорткод: это минимизирует вмешательство в шаблоны и избавляет от ручной правки страниц. Пример регистрации через шорткод:
function my_register_shortcode() {
ob_start(); ?>
<form method=\"post\">
<input type=\"text\" name=\"username\" placeholder=\"Логин\" required>
<input type=\"email\" name=\"email\" placeholder=\"Email\" required>
<input type=\"password\" name=\"password\" placeholder=\"Пароль\" required>
<input type=\"submit\" name=\"register_user\" value=\"Зарегистрироваться\">
</form>
Подключайте через functions.php
, но не в корень – создайте отдельный файл и подгрузите через require_once
. Пример:
require_once get_template_directory() . \'/inc/user-handlers.php\';
Не используйте admin_post
для публичных обработчиков – уязвимо. Только wp_create_user
, wp_signon
, is_user_logged_in
. Минимум сторонних функций.
Важно: не доверяйте
$_POST
безsanitize_*
! Всё, что приходит снаружи, должно быть проверено и очищено.
Хотите авторизацию? Заворачивайте в wp_signon()
. Пример:
$user = wp_signon([
\'user_login\' => $_POST[\'username\'],
\'user_password\' => $_POST[\'password\'],
\'remember\' => true
], false);
Если нужна переадресация – не используйте wp_redirect
без exit
. Всё ломается.
Хуки user_register
, login_form_login
, template_redirect
дают гибкость. Не игнорируйте их.
Интерфейс шорткода должен быть чистым. Никаких echo
внутри логики. Только буферизация.
Разносите по частям: шорткод отвечает за отображение, обработчик – за действия. Не связывайте их напрямую.
Разделяйте ответственность. Смешение логики и верстки – путь к хаосу.
Обработка отправки данных формы с проверкой и созданием пользователя
Сначала – проверка nonce. Без этого WordPress не воспримет отправку как допустимую. Используй check_admin_referer()
или wp_verify_nonce()
, если nonce создавался вручную. Без него – дыра в безопасности.
if ( ! isset( $_POST[\'custom_register_nonce\'] ) ||
! wp_verify_nonce( $_POST[\'custom_register_nonce\'], \'custom_register_action\' ) ) {
wp_die( \'Неверный запрос\' );
}
Дальше – валидация. Имя, email, пароль. Проверяй всё. Не верь пользователю ни на секунду. Пример – минимальный набор:
$errors = [];
$username = sanitize_user( $_POST[\'username\'] );
$email = sanitize_email( $_POST[\'email\'] );
$password = $_POST[\'password\'];
if ( empty( $username ) || strlen( $username ) < 4 ) {
$errors[] = \'Имя должно быть не короче 4 символов\';
}
if ( ! is_email( $email ) ) {
$errors[] = \'Некорректный email\';
}
if ( email_exists( $email ) ) {
$errors[] = \'Такой email уже зарегистрирован\';
}
if ( username_exists( $username ) ) {
$errors[] = \'Имя занято\';
}
if ( empty( $password ) || strlen( $password ) < 6 ) {
$errors[] = \'Пароль слишком короткий\';
}
if ( ! empty( $errors ) ) {
foreach ( $errors as $error ) {
echo \'<p>\' . esc_html( $error ) . \'</p>\';
}
exit;
}
Внимание! Никогда не передавай пароль в чистом виде через JS – только через HTTPS и в поле
type=\"password\"
.
Теперь создаём аккаунт. Используй wp_create_user()
или wp_insert_user()
– в зависимости от условий. Первый – проще. Второй – гибче.
$user_id = wp_create_user( $username, $password, $email );
if ( is_wp_error( $user_id ) ) {
echo \'<p>Ошибка: \' . esc_html( $user_id->get_error_message() ) . \'</p>\';
exit;
}
После – можно назначить роль, установить мета, авторизовать пользователя. Без фанатизма.
wp_update_user( [
\'ID\' => $user_id,
\'role\' => \'subscriber\',
] );
wp_set_current_user( $user_id );
wp_set_auth_cookie( $user_id );
do_action( \'wp_login\', $username, get_user_by( \'id\', $user_id ) );
Важно помнить:
wp_set_auth_cookie()
не запускает редирект. Делайwp_redirect()
вручную, иначе пользователь застрянет на странице отправки.
Готово. Сервер принял. Пользователь создан. Всё под контролем. Или нет?
Используйте хук wp_login_failed
для захвата неудачных попыток входа. Он позволяет перехватывать имя пользователя и задавать направление переадресации вручную, минуя дефолтную логику системы.
add_action(\'wp_login_failed\', \'custom_login_failed_redirect\');
function custom_login_failed_redirect($username) {
$referrer = wp_get_referer();
if (!empty($referrer) && !strstr($referrer, \'wp-login\') && !strstr($referrer, \'wp-admin\')) {
wp_redirect(add_query_arg(\'login\', \'failed\', $referrer));
exit;
}
}
if (isset($_GET[\'login\']) && $_GET[\'login\'] === \'failed\') {
echo \'<p class=\"error-message\">Неверный логин или пароль. Попробуйте снова.</p>\';
}
Внимание! Никогда не вставляйте ошибку напрямую в HTML без очистки. Используйте
esc_html()
илиsanitize_text_field()
.
Хук authenticate
поможет более тонко обрабатывать ошибки авторизации. Пример ниже отсекает пустые значения и задаёт свои сообщения:
add_filter(\'authenticate\', \'custom_authenticate_handler\', 30, 3);
function custom_authenticate_handler($user, $username, $password) {
if (empty($username) || empty($password)) {
$referrer = wp_get_referer();
wp_redirect(add_query_arg(\'login\', \'empty\', $referrer));
exit;
}
return $user;
}
Важно помнить: если вы используете
wp_redirect
внутри фильтра, обязательно вызывайтеexit
сразу после. Без этого переадресация не сработает.
Для успешного входа используйте хук wp_login
. Позволяет задать маршрут, отличный от панели управления. Например:
add_action(\'wp_login\', \'custom_login_redirect\', 10, 2);
function custom_login_redirect($user_login, $user) {
wp_redirect(home_url(\'/dashboard\'));
exit;
}
Реакция на каждую ситуацию – строго через параметры в URL. Никаких сессионных переменных или редиректов без проверки источника. Логика должна быть атомарной. Ошибки – видимые. Поведение – предсказуемое.
Игра – на миллисекунды. Переадресация – вопрос UX. Никакой пощады для лишнего клика. Ноль лишнего шума. Только результат.