Почему нужно добавить поле для кода подтверждения в WooCommerce?
В некоторых интернет-магазинах требуется дополнительная валидация покупателя во время оформления заказа — например, ввод кода подтверждения, который может быть отправлен по SMS или email. Это повышает безопасность и снижает риск мошенничества.
Диагностика: как понять, что стандартных полей WooCommerce недостаточно
Если в вашем магазине часто возникают ошибки с некорректными или мошенническими заказами, или вы используете внешние сервисы для двухфакторной аутентификации, стандартного набора полей оформления заказа может быть недостаточно. В WooCommerce нет поля для ввода кода подтверждения по умолчанию.
Признаки необходимости добавления поля:
- Вы используете SMS- или email-подтверждение заказа;
- Покупатели жалуются, что не могут ввести код подтверждения;
- Вам нужно проверить уникальный код до завершения заказа.
Пошаговое решение: добавление и обработка поля для кода подтверждения
1. Добавляем поле в форму оформления заказа
add_filter('woocommerce_checkout_fields', 'add_confirmation_code_checkout_field');
function add_confirmation_code_checkout_field($fields) {
$fields['billing']['billing_confirmation_code'] = array(
'type' => 'text',
'label' => __('Код подтверждения', 'woocommerce'),
'required' => true,
'placeholder' => __('Введите код, отправленный вам', 'woocommerce'),
'class' => array('form-row-wide'),
'priority' => 120,
);
return $fields;
}2. Валидация поля на сервере
add_action('woocommerce_checkout_process', 'validate_confirmation_code_field');
function validate_confirmation_code_field() {
if (empty($_POST['billing_confirmation_code'])) {
wc_add_notice(__('Пожалуйста, введите код подтверждения.'), 'error');
} else {
$code = sanitize_text_field($_POST['billing_confirmation_code']);
// Пример проверки кода (замените на вашу логику)
if ($code !== '123456') {
wc_add_notice(__('Неверный код подтверждения.'), 'error');
}
}
}3. Сохранение значения поля в метаданных заказа
add_action('woocommerce_checkout_update_order_meta', 'save_confirmation_code_order_meta');
function save_confirmation_code_order_meta($order_id) {
if (!empty($_POST['billing_confirmation_code'])) {
update_post_meta($order_id, '_billing_confirmation_code', sanitize_text_field($_POST['billing_confirmation_code']));
}
}4. Отображение поля в админке заказа
add_action('woocommerce_admin_order_data_after_billing_address', 'display_confirmation_code_admin_order', 10, 1);
function display_confirmation_code_admin_order($order) {
$code = get_post_meta($order->get_id(), '_billing_confirmation_code', true);
if ($code) {
echo '<p><strong>' . __('Код подтверждения') . ':</strong> ' . esc_html($code) . '</p>';
}
}Проверка результата после внедрения
Для проверки выполните следующие шаги:
- Откройте страницу оформления заказа и убедитесь, что новое поле "Код подтверждения" отображается.
- Попробуйте оформить заказ без заполнения поля — должна появиться ошибка.
- Введя неправильный код (например, не "123456"), проверьте, что выводится ошибка о неверном коде.
- Введя правильный код "123456" (или ваш рабочий), заказ должен пройти успешно.
- В админке в карточке заказа проверьте, что поле с кодом сохранено и отображается.
Частые ошибки и как их исправить
- Поле не отображается на странице оформления заказа: проверьте, что хук
woocommerce_checkout_fieldsдобавлен в functions.php вашей активной темы или плагина, и нет конфликтов с другими плагинами. - Ошибка валидации не появляется: убедитесь, что хук
woocommerce_checkout_processкорректно подключен, и что вывод ошибок работает (wc_add_notice). - Значение поля не сохраняется в заказе: проверьте, что вы используете
woocommerce_checkout_update_order_metaи что ключ метаполя уникален и не конфликтует с другими. - Код подтверждения не проверяется по вашей логике: замените пример проверки на реальную интеграцию с вашим SMS-провайдером или БД кодов.
Практические советы по безопасности и производительности
- Используйте
sanitize_text_field()для очистки данных из формы, чтобы избежать XSS. - Не храните коды подтверждения в открытом виде в базе, если они одноразовые — лучше сверять их на лету через API провайдера.
- Для масштабных магазинов с высоким трафиком оптимизируйте валидацию через AJAX, чтобы уменьшить нагрузку на сервер и повысить UX.
- Если добавляете множество кастомных полей — группируйте их, чтобы не засорять базу метаданными.
Сравнение способов реализации поля для кода подтверждения
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код в functions.php | Полный контроль, нет лишних плагинов | Требует навыков PHP, сложнее поддерживать | Пример кода в статье |
| Плагин для кастомных полей (например, Checkout Field Editor) | Простой интерфейс, быстро | Потенциально лишний плагин, меньше гибкости | Checkout Field Editor от WooCommerce |
| Интеграция с внешним сервисом SMS | Автоматизация, безопасность | Сложность настройки, возможные задержки | Интеграция с Twilio, SMS.ru и др. |