Как создать произвольные формы регистрации и входа в WordPress с помощью Profile Builder

Используйте 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-структуру интерфейса через шорткод: это минимизирует вмешательство в шаблоны и избавляет от ручной правки страниц. Пример регистрации через шорткод:

Читайте также:  В чем разница между темами WordPress и шаблонами WordPress и как их правильно использовать


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() вручную, иначе пользователь застрянет на странице отправки.

Готово. Сервер принял. Пользователь создан. Всё под контролем. Или нет?

Читайте также:  Как добавить CAPTCHA Cloudflare Turnstile в WordPress

Используйте хук 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. Никакой пощады для лишнего клика. Ноль лишнего шума. Только результат.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *