Диагностика задачи: зачем нужна авторизация по номеру телефона в WooCommerce
Стандартная авторизация WooCommerce предполагает вход через email и пароль. Однако для многих интернет-магазинов удобнее и эффективнее авторизовать покупателя по номеру телефона с подтверждением через SMS. Такой метод повышает конверсию и снижает количество фейковых аккаунтов.
Часто встречающиеся проблемы при реализации такой авторизации:
- Отсутствие встроенной поддержки входа по телефону в WooCommerce
- Трудности с интеграцией SMS-API
- Проблемы с безопасностью и сессиями
- Ошибки валидации номера телефона
Пошаговое решение: как настроить авторизацию по номеру телефона с SMS в WooCommerce
1. Добавление поля ввода телефона вместо email на странице входа
Для начала нужно заменить стандартное поле email на телефон. В functions.php темы или в плагине используйте следующий код:
add_filter('woocommerce_login_form_fields', function($fields) {
if (isset($fields['username'])) {
$fields['username']['type'] = 'tel';
$fields['username']['label'] = 'Номер телефона';
$fields['username']['placeholder'] = '+7 (999) 999-99-99';
}
return $fields;
});Если фильтр woocommerce_login_form_fields не работает в вашей версии, можно переопределить шаблон myaccount/form-login.php в дочерней теме, заменив поле email на телефон.
2. Валидация и форматирование номера телефона
Важна строгая валидация номера. Для этого можно использовать preg_match или подключить библиотеку libphonenumber. Для простоты пример с регулярным выражением:
function validate_phone_number($phone) {
return preg_match('/^\+7\d{10}$/', $phone);
}Вызывайте эту функцию при обработке данных формы.
3. Интеграция SMS-API для отправки кода подтверждения
Выберите SMS-провайдера (например, sms.ru, Twilio, или другие) и настройте отправку сообщения с кодом.
function send_sms_code($phone, $code) {
$api_key = 'ВАШ_API_КЛЮЧ';
$message = "Ваш код для входа: $code";
$url = "https://sms.ru/sms/send?api_id=$api_key&to=$phone&msg=" . urlencode($message);
wp_remote_get($url);
}Обрабатывайте ошибки ответа API для надёжности.
4. Реализация логики проверки кода и входа пользователя
При вводе телефона и отправке формы генерируйте случайный код и сохраняйте его в сессию или transient с TTL 5-10 минут. Затем предоставьте пользователю форму для ввода кода. После корректного ввода кода авторизуйте пользователя или создайте нового.
session_start();
// Генерация и сохранение кода
$code = rand(100000, 999999);
$_SESSION['sms_code'] = $code;
$_SESSION['phone_for_login'] = $phone;
send_sms_code($phone, $code);
// Проверка кода
if ($_POST['code'] === $_SESSION['sms_code']) {
$user = get_user_by('meta_value', $_SESSION['phone_for_login']);
if (!$user) {
// Создать пользователя
$user_id = wp_create_user($phone, wp_generate_password(), $phone . '@example.com');
update_user_meta($user_id, 'billing_phone', $_SESSION['phone_for_login']);
$user = get_user_by('id', $user_id);
}
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
unset($_SESSION['sms_code'], $_SESSION['phone_for_login']);
wp_redirect(home_url());
exit;
}Проверка результата после внедрения
- Откройте страницу входа и убедитесь, что поле email заменено на телефон
- Попробуйте ввести номер в неправильном формате — должна сработать валидация
- Введите правильный номер, получите SMS с кодом
- Введите код — пользователь должен успешно авторизоваться
- Проверьте, что при отсутствии кода или при неправильном коде вход не разрешается
Частые ошибки и способы их устранения
- Код не отправляется: проверьте правильность API-ключа, URL и обработку ошибок wp_remote_get
- Номер телефона сохраняется некорректно: используйте единый формат, например E.164, для хранения и поиска
- Сессии не сохраняются: убедитесь, что
session_start()вызывается до вывода контента - Пользователь не создаётся или не авторизуется: проверьте права и ошибки функций
wp_create_userиwp_set_auth_cookie
Практические советы по безопасности и производительности
- Используйте HTTPS, чтобы защитить передачу данных
- Ограничьте количество запросов на отправку SMS по IP и номеру, чтобы избежать спама
- Храните коды подтверждения с ограниченным временем жизни (5-10 минут)
- Для хранения кода лучше использовать
set_transientс уникальным ключом, а не сессии, если сайт работает на нескольких серверах - Обрабатывайте ошибки SMS-API и логируйте их для отладки
- Проверяйте актуальность номера перед отправкой кода (например, с помощью маски и предварительной проверки формата)
Сравнение подходов к авторизации по телефону в WooCommerce
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин (например, "WC Phone Login") | Быстрая настройка, интеграция SMS | Платный, ограниченная кастомизация | Clearfy Pro может помочь с оптимизацией |
| Самописный код на PHP + SMS API | Полный контроль, кастомизация под задачу | Требует разработки и поддержки | Пример кода в статье |
| Использование сторонних сервисов авторизации (например, Firebase) | Надёжность, масштабируемость | Зависимость от внешних сервисов, сложность интеграции | Не рассмотрено в статье |