Почему нужна авторизация через телефон в WooCommerce
Традиционная авторизация по email и паролю не всегда удобна для пользователей интернет-магазина на WooCommerce. Авторизация через телефон позволяет упростить вход, повысить конверсию и ускорить процесс оформления заказа. Однако многие решения требуют установки плагинов, что иногда нежелательно из-за безопасности и производительности.
В этой статье разберём, как реализовать авторизацию через телефон без использования плагинов, а также как решить типовые проблемы, возникающие на этом пути.
Диагностика проблем с авторизацией по телефону
Типичные симптомы
- Пользователь не может войти по номеру телефона, хотя он зарегистрирован;
- Форма авторизации не принимает номер в нужном формате;
- Отсутствует проверка уникальности телефона при регистрации;
- WooCommerce и WordPress не распознают номер телефона как идентификатор;
- Сессии пользователя не создаются корректно после входа.
Как проверить, что именно не работает
- Проверьте, что в базе данных WordPress у пользователей есть мета с ключом
phone_numberи правильным значением. - Проверьте логи ошибок PHP на предмет сбоев при обработке формы.
- Проверьте, корректно ли обрабатывается POST-запрос на вход (например, через
var_dump($_POST)или инструменты браузера). - Проверьте, что функция аутентификации заменена или расширена для поддержки телефона.
Пошаговое решение: как реализовать авторизацию через телефон без плагинов
1. Добавляем поле телефона в профиль пользователя и форму регистрации
Добавим поле phone_number и сохраним его в user meta.
add_action('woocommerce_register_form', function() {
?><p class="form-row form-row-wide">
<label for="reg_phone_number">Телефон <span class="required">*</span></label>
<input type="text" class="input-text" name="phone_number" id="reg_phone_number" value="" />
</p><?php
});
add_action('woocommerce_created_customer', function($customer_id) {
if (isset($_POST['phone_number'])) {
update_user_meta($customer_id, 'phone_number', sanitize_text_field($_POST['phone_number']));
}
});2. Проверяем уникальность телефона при регистрации
add_action('woocommerce_register_post', function($username, $email, $validation_errors) {
if (isset($_POST['phone_number']) && !empty($_POST['phone_number'])) {
$phone = sanitize_text_field($_POST['phone_number']);
$users = get_users(array(
'meta_key' => 'phone_number',
'meta_value' => $phone
));
if (!empty($users)) {
$validation_errors->add('phone_exists', 'Пользователь с таким телефоном уже зарегистрирован.');
}
} else {
$validation_errors->add('phone_empty', 'Поле телефон обязательно для заполнения.');
}
}, 10, 3);3. Добавляем форму входа по телефону
Создадим отдельную форму или расширим стандартную, чтобы принимать вместо логина телефон.
add_action('woocommerce_login_form_start', function() {
?>
<p class="form-row form-row-wide">
<label for="phone_login">Телефон или email</label>
<input type="text" class="input-text" name="phone_login" id="phone_login" />
</p>
<?php
});4. Перехватываем процесс авторизации и ищем пользователя по телефону
add_filter('authenticate', function($user, $username, $password) {
if (empty($username) && !empty($_POST['phone_login'])) {
$phone = sanitize_text_field($_POST['phone_login']);
$users = get_users(array(
'meta_key' => 'phone_number',
'meta_value' => $phone,
'number' => 1
));
if (!empty($users)) {
$user_obj = $users[0];
$user = wp_authenticate($user_obj->user_login, $password);
} else {
return new WP_Error('invalid_phone', 'Пользователь с таким телефоном не найден.');
}
}
return $user;
}, 20, 3);5. Обеспечиваем безопасность и валидацию форм
Добавьте проверку nonce в форму, чтобы избежать CSRF, и валидируйте формат номера телефона через регулярные выражения.
Проверка результата после внедрения
- Зарегистрируйтесь с новым номером телефона. Если номер уже есть — вы получите ошибку.
- Попробуйте войти, вводя телефон в поле логина и правильный пароль.
- Проверьте в базе данных, что у пользователя появился мета-ключ
phone_numberс корректным значением. - Убедитесь, что после входа пользователь получает доступ к личному кабинету WooCommerce.
Частые ошибки и как их исправить
- Ошибка: Пользователь не может войти по телефону, даже если номер правильный.
Причина: В фильтреauthenticateне происходит вызовwp_authenticateс логином пользователя.
Решение: Убедитесь, что вы подставляете$user_obj->user_loginв функцию аутентификации. - Ошибка: Телефон не сохраняется при регистрации.
Причина: Отсутствует хукwoocommerce_created_customerили неверно указан ключ.
Решение: Проверьте, чтоupdate_user_metaвызывается с правильным ID пользователя и ключомphone_number. - Ошибка: Нет проверок формата телефона, пользователь вводит некорректные данные.
Решение: Добавьте серверную валидацию номера через регулярное выражение, например:if (!preg_match('/^\+?\d{10,15}$/', $phone)) { $validation_errors->add('phone_invalid', 'Введите корректный номер телефона в международном формате.'); }
Практические советы по безопасности и производительности
- Используйте
wp_nonce_fieldи проверяйте nonce при отправке форм, чтобы защититься от CSRF. - Ограничьте количество попыток входа по телефону, чтобы предотвратить перебор паролей (например, через
wp_login_failedхук и запись IP в transient). - Сохраняйте телефон в стандартизированном формате (например, E.164), чтобы избежать дублирования и проблем с поиском.
- Кэшируйте результаты поиска пользователя по телефону, если у вас большой сайт, чтобы снизить нагрузку на базу.
- Для улучшения UX можно добавить отправку одноразового кода на телефон, но это уже выходит за рамки решения без плагинов.
Сравнение вариантов реализации авторизации по телефону
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Использование плагинов (например, WooCommerce Phone Login) | Быстрая настройка, готовый функционал, поддержка SMS | Зависимость от стороннего кода, нагрузка, возможные конфликты | Подходит для сложных проектов с бюджетом |
| Реализация через кастомный код (как в статье) | Полный контроль, нет лишних зависимостей, легковесность | Требует времени на разработку и тестирование, нет готовой поддержки SMS | Оптимально для опытных разработчиков и небольших проектов |
| Использование внешних сервисов API для авторизации | Высокая безопасность, масштабируемость | Зависимость от внешних сервисов, дополнительные расходы | Подходит для крупных проектов с высоким трафиком |