Почему нужна авторизация по телефону без пароля в WooCommerce?
Многие магазины на WooCommerce стремятся упростить процесс входа для пользователей, используя номер телефона вместо классического логина и пароля. Это снижает трение при оформлении заказа и повышает конверсию. В статье разберём, как реализовать авторизацию по SMS-коду на WooCommerce с минимальным набором сторонних компонентов и кастомным кодом.
Диагностика задачи: что нужно понимать перед реализацией?
Прежде чем внедрять авторизацию по телефону без пароля, уточните:
- Имеется ли у вас SMS-шлюз для отправки кодов? Без него реализовать проверку не получится.
- Как вы будете хранить и сопоставлять номера телефонов с пользователями в базе WooCommerce?
- В каких местах сайта должен работать вход по телефону — только страница входа, оформление заказа, или все разделы?
Без ответа на эти вопросы простая авторизация невозможна.
Пошаговое решение: как подключить авторизацию по телефону в WooCommerce
1. Добавляем поле ввода телефона на страницу входа
Используем хук woocommerce_login_form, чтобы добавить поле:
add_action('woocommerce_login_form', function() {
echo '<p class="form-row form-row-wide">';
echo '<label for="phone_number">Номер телефона <span class="required">*</span></label>';
echo '<input type="text" name="phone_number" id="phone_number" class="input-text" autocomplete="tel" />';
echo '</p>';
});2. Перехватываем отправку формы и отправляем SMS с кодом
При сабмите проверяем телефон, генерируем код и отправляем SMS. Код сохраняем в сессию или transient (лучше transient для безопасности).
add_action('woocommerce_login_post', function() {
if (isset($_POST['phone_number'])) {
$phone = sanitize_text_field($_POST['phone_number']);
// Проверяем, есть ли пользователь с таким телефоном
$user = get_users(array(
'meta_key' => 'billing_phone',
'meta_value' => $phone,
'number' => 1,
'count_total' => false
));
if (!$user) {
wc_add_notice('Пользователь с таким номером не найден', 'error');
return;
}
$code = rand(100000, 999999);
set_transient('login_sms_code_' . $phone, $code, 5 * MINUTE_IN_SECONDS);
// Отправляем SMS через ваш шлюз
// Например, send_sms($phone, "Ваш код: $code");
wc_add_notice('Код подтверждения отправлен на ваш номер', 'notice');
// После отправки показать форму для ввода кода
}
});3. Создаём форму для ввода кода подтверждения
Добавьте дополнительное поле на страницу входа при наличии transient с кодом:
add_action('woocommerce_login_form', function() {
if (!empty($_POST['phone_number']) && get_transient('login_sms_code_' . sanitize_text_field($_POST['phone_number']))) {
echo '<p class="form-row form-row-wide">';
echo '<label for="sms_code">Код подтверждения <span class="required">*</span></label>';
echo '<input type="text" name="sms_code" id="sms_code" class="input-text" />';
echo '</p>';
}
});4. Проверяем введённый код и логиним пользователя
На обработке формы проверяем код и логиним пользователя программно:
add_action('woocommerce_login_post', function() {
if (isset($_POST['phone_number']) && isset($_POST['sms_code'])) {
$phone = sanitize_text_field($_POST['phone_number']);
$code = sanitize_text_field($_POST['sms_code']);
$saved_code = get_transient('login_sms_code_' . $phone);
if ($code !== $saved_code) {
wc_add_notice('Неверный код подтверждения', 'error');
return;
}
delete_transient('login_sms_code_' . $phone);
$user = get_users(array(
'meta_key' => 'billing_phone',
'meta_value' => $phone,
'number' => 1,
'count_total' => false
));
if (!$user) {
wc_add_notice('Пользователь не найден', 'error');
return;
}
wp_set_current_user($user[0]->ID);
wp_set_auth_cookie($user[0]->ID);
wp_redirect(wp_get_referer() ?: wc_get_page_permalink('myaccount'));
exit;
}
});Проверка результата: как убедиться, что всё работает?
- Зайдите на страницу входа WooCommerce, введите номер телефона, зарегистрированный в вашем магазине.
- Должен отправиться SMS с кодом (проверьте логи SMS-шлюза или тестовый номер).
- После ввода правильного кода вы должны попасть в личный кабинет без ввода пароля.
- При неправильном коде или незарегистрированном номере должны появляться ошибки.
Частые ошибки и как их исправить
- Номер телефона не найден: Проверьте, что номера телефонов пользователей сохранены в мета-ключе
billing_phone. Если в другом поле — измените запрос. - Код не приходит: Проверьте работу SMS-шлюза, настройки API и лимиты отправки.
- Код не сохраняется или быстро истекает: Убедитесь, что transient сохраняется на 5-10 минут, и сервер поддерживает эту функцию.
- Пользователь не логинится: Проверьте вызовы
wp_set_current_userиwp_set_auth_cookie, а также отсутствие ошибок до редиректа.
Практические советы по безопасности и оптимизации
- Обязательно используйте HTTPS для защиты данных при вводе номера и кода.
- Ограничьте количество попыток ввода кода, чтобы избежать перебора.
- Храните коды в transient, чтобы автоматически очищать устаревшие значения.
- Для SMS-рассылок выбирайте проверенных провайдеров с поддержкой API и логированием.
- Рассмотрите применение двойной авторизации для важных операций (например, изменение профиля).
Сравнение вариантов реализации авторизации по телефону в WooCommerce
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин SMS Login | Быстрая установка, готовый функционал | Зависимость от плагина, ограниченная кастомизация | Подходит для быстрой реализации без навыков кода |
| Кастомный код с SMS API | Полный контроль, интеграция под задачи | Требует разработки, поддержка | Оптимально для уникальных требований |
| OAuth по телефону через сторонние сервисы | Безопасность, поддержка 2FA | Сложность интеграции, стоимость | Для крупных проектов с бюджетом |