Диагностика проблемы: почему стандартной регистрации WooCommerce недостаточно
Стандартная форма регистрации WooCommerce не включает поле для ввода телефона. Для интернет-магазинов это критично, поскольку номер телефона нужен для связи с клиентом, подтверждения заказа и доставки. Без дополнительной валидации телефонных номеров часто приходят некорректные данные, что снижает качество обслуживания.
Пошаговое решение: добавление и валидация поля телефона в WooCommerce
1. Добавляем поле телефона в форму регистрации
Для этого воспользуемся хуком woocommerce_register_form. Вставляем следующий код в файл functions.php вашей темы или в плагин для кастомизации:
add_action('woocommerce_register_form', 'add_phone_field_to_registration_form');
function add_phone_field_to_registration_form() {
?>
<p class="form-row form-row-wide">
<label for="reg_billing_phone"><?php _e('Телефон', 'woocommerce'); ?> <span class="required">*</span></label>
<input type="tel" class="input-text" name="billing_phone" id="reg_billing_phone" value="<?php if (!empty($_POST['billing_phone'])) echo esc_attr($_POST['billing_phone']); ?>" />
</p>
<?php
}2. Валидация введённого телефона
Добавим проверку на обязательное заполнение и базовый формат с помощью регулярного выражения. Используем хук woocommerce_register_post:
add_filter('woocommerce_registration_errors', 'validate_phone_field_registration', 10, 3);
function validate_phone_field_registration($errors, $username, $email) {
if (empty($_POST['billing_phone'])) {
$errors->add('billing_phone_error', __('Пожалуйста, введите номер телефона.', 'woocommerce'));
} elseif (!preg_match('/^\+?\d{10,15}$/', $_POST['billing_phone'])) {
$errors->add('billing_phone_format_error', __('Введите корректный номер телефона, например +71234567890.', 'woocommerce'));
}
return $errors;
}3. Сохраняем номер телефона в метаданные пользователя
После успешной регистрации запишем номер телефона в профиль пользователя и в заказ:
add_action('woocommerce_created_customer', 'save_phone_field_registration');
function save_phone_field_registration($customer_id) {
if (isset($_POST['billing_phone'])) {
update_user_meta($customer_id, 'billing_phone', sanitize_text_field($_POST['billing_phone']));
}
}Проверка результата после внедрения
- Откройте страницу регистрации WooCommerce и убедитесь, что поле "Телефон" отображается.
- Попробуйте зарегистрироваться без номера — должна появиться ошибка.
- Ввод некорректного номера (например, буквы или короткий номер) должен вызвать ошибку.
- После успешной регистрации проверьте в админке WordPress в профиле пользователя наличие мета-поля
billing_phoneс введённым номером.
Частые ошибки и как их исправить
- Поле не отображается на форме: Проверьте, что код добавлен в активную тему или плагин, и что нет конфликтов с другими хуками.
- Ошибки валидации не показываются: Убедитесь, что фильтр
woocommerce_registration_errorsприменён корректно и функция возвращает объект$errors. - Номер не сохраняется: Проверьте, что функция сохранения подключена к хуку
woocommerce_created_customerи что полеbilling_phoneправильно передаётся через POST.
Практические советы по безопасности и производительности
- Используйте функцию
sanitize_text_field()для очистки входящих данных. - Регулярное выражение для проверки номера телефона можно адаптировать под регион, но избегайте чрезмерно сложных проверок на этапе регистрации — лучше валидировать номер отдельно через SMS-сервис.
- Не храните номер телефона в незашифрованном виде, если используете дополнительные интеграции — рассмотрите возможность шифрования в базе.
Сравнение вариантов решения задачи
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Ручное добавление поля и валидации через хуки | Полный контроль, нет лишних плагинов | Требует навыков разработки, можно забыть обновить при смене темы |
| Плагин для регистрации | Использование плагинов типа "User Registration" или "WooCommerce Custom Fields" | Быстрое решение без кода | Лишние зависимости, возможные конфликты и нагрузка |
| Платные решения с SMS-верификацией | Готовые комплексы с подтверждением номера через SMS | Максимальная надёжность и безопасность | Стоимость и сложность интеграции |