Диагностика задачи: зачем нужно подтверждение номера телефона в WooCommerce
В интернет-магазинах на WooCommerce часто требуется не только сбор номера телефона клиента, но и его подтверждение. Это помогает снизить количество ошибок в заказах, повысить качество обратной связи и уменьшить мошенничество. По умолчанию WooCommerce не предоставляет второго поля для подтверждения телефона, поэтому приходится добавлять его самостоятельно.
Пошаговое решение: добавление поля подтверждения номера телефона
1. Добавляем новое поле на страницу оформления заказа
Используем хук woocommerce_checkout_fields для добавления поля billing_phone_confirm рядом с основным телефоном:
add_filter('woocommerce_checkout_fields', function($fields) {
$fields['billing']['billing_phone_confirm'] = array(
'type' => 'tel',
'label' => 'Подтверждение номера телефона',
'required' => true,
'priority' => 25,
'placeholder' => 'Введите номер телефона повторно',
'class' => array('form-row-wide'),
'clear' => true,
);
return $fields;
});2. Валидируем совпадение номеров при отправке формы
Добавляем проверку с помощью хука woocommerce_checkout_process, чтобы убедиться, что оба поля совпадают:
add_action('woocommerce_checkout_process', function() {
if ( isset($_POST['billing_phone']) && isset($_POST['billing_phone_confirm']) ) {
$phone = sanitize_text_field($_POST['billing_phone']);
$phone_confirm = sanitize_text_field($_POST['billing_phone_confirm']);
if ($phone !== $phone_confirm) {
wc_add_notice('Номера телефонов не совпадают. Пожалуйста, введите одинаковые номера.', 'error');
}
}
});3. Сохраняем подтверждённый номер телефона в метаданных заказа
Для удобства можно сохранить подтверждение или использовать его для логики, например, отметку об успешном подтверждении:
add_action('woocommerce_checkout_update_order_meta', function($order_id) {
if ( isset($_POST['billing_phone_confirm']) ) {
update_post_meta($order_id, '_billing_phone_confirm', sanitize_text_field($_POST['billing_phone_confirm']));
}
});Проверка результата после внедрения
- Перейдите на страницу оформления заказа и убедитесь, что появилось новое поле «Подтверждение номера телефона».
- Попробуйте ввести разные номера в поле телефона и подтверждения — должна появиться ошибка.
- При совпадении номеров заказ должен успешно оформляться.
- Проверьте в админке WooCommerce в деталях заказа наличие метаданных
_billing_phone_confirmс введённым значением.
Частые ошибки и способы их исправления
- Поле не отображается на странице оформления заказа. Проверьте, что код добавлен в файл
functions.phpактивной темы или в плагин, и что нет конфликтов с другими плагинами, перезапустите кэш. - Ошибка валидации не срабатывает. Убедитесь, что хук
woocommerce_checkout_processдобавлен корректно и функция не завершается раньше из-за ошибок в коде. - Данные не сохраняются в заказе. Проверьте, что в
$_POSTприходят оба поля и чтоupdate_post_metaвызывается с правильным ID заказа. - Формат номера телефона не проверяется. Для дополнительной валидации можно добавить регулярное выражение или подключить библиотеку libphonenumber.
Практические советы по безопасности и производительности
- Всегда используйте функции
sanitize_text_fieldдля очистки данных из формы. - Не храните в базе необработанные данные пользователя.
- Для масштабируемых решений можно реализовать подтверждение номера через SMS-сервисы, но это выходит за рамки данной статьи.
- Минимизируйте количество полей, чтобы не усложнять оформление заказа.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
Добавление поля через woocommerce_checkout_fields | Простая реализация, подходит для большинства задач | Нет полноценной проверки формата номера | В статье |
| Использование плагинов для подтверждения телефона (например, SMS-сервисы) | Реальное подтверждение номера через SMS | Дополнительная стоимость, сложность настройки | Плагины на маркетплейсах WooCommerce |
| Валидация номера с помощью регулярных выражений или библиотек | Точная проверка формата номера | Требуется дополнительный код и тестирование | Самостоятельная разработка |