Диагностика задачи: зачем нужно поле с кодом подтверждения в WooCommerce
В стандартной комплектации WooCommerce не предусматривает возможность добавления дополнительного поля для подтверждения заказа, например, ввода кода подтверждения, полученного по SMS или email. Такая функциональность актуальна при необходимости дополнительной верификации покупателя или для акций с промокодами, требующими подтверждения. Без кастомизации реализовать это невозможно.
Пошаговое решение: добавляем поле для кода подтверждения на страницу оформления заказа
1. Добавление поля в форму оформления заказа
Используем хук woocommerce_checkout_fields для добавления текстового поля в секцию адреса или отдельным блоком. Например, добавим поле confirmation_code после поля с email:
add_filter('woocommerce_checkout_fields', function($fields) {
$fields['billing']['confirmation_code'] = [
'type' => 'text',
'label' => 'Код подтверждения',
'placeholder' => 'Введите код подтверждения из SMS',
'required' => true,
'class' => ['form-row-wide'],
'priority' => 60,
];
return $fields;
});2. Валидация введённого кода
Добавим проверку введённого кода при отправке формы заказа, используя хук woocommerce_checkout_process. Для примера проверим, что код равен строке 123456. В реальном сценарии здесь должна быть интеграция с системой отправки и проверки SMS или email:
add_action('woocommerce_checkout_process', function() {
if (!isset($_POST['confirmation_code']) || $_POST['confirmation_code'] !== '123456') {
wc_add_notice('Неверный код подтверждения. Пожалуйста, введите правильный код.', 'error');
}
});3. Сохранение поля в метаданных заказа
Чтобы сохранить введённый код в заказе, используем хук woocommerce_checkout_update_order_meta:
add_action('woocommerce_checkout_update_order_meta', function($order_id) {
if (!empty($_POST['confirmation_code'])) {
update_post_meta($order_id, '_confirmation_code', sanitize_text_field($_POST['confirmation_code']));
}
});4. Отображение кода подтверждения в админке
Для удобства просмотра добавим код в метабоксы редактирования заказа:
add_action('woocommerce_admin_order_data_after_billing_address', function($order){
$code = get_post_meta($order->get_id(), '_confirmation_code', true);
if ($code) {
echo '<p><strong>Код подтверждения:</strong> ' . esc_html($code) . '</p>';
}
});Проверка результата после внедрения
- Перейдите на страницу оформления заказа в магазине WooCommerce.
- Проверьте наличие нового поля "Код подтверждения" после email.
- Попробуйте оформить заказ, введя неправильный код — должна появиться ошибка.
- Введя код
123456, заказ должен успешно оформиться. - В админке в карточке заказа проверьте, что код отображается в разделе с адресом биллинга.
Частые ошибки и как их исправить
- Поле не отображается на странице оформления заказа: проверьте, что функция добавления поля подключена и нет конфликтов с темой или плагинами, которые могут переопределять поля оформления заказа.
- Валидация не срабатывает: убедитесь, что хук
woocommerce_checkout_processкорректно добавлен и не перезаписывается другим кодом. - Данные не сохраняются в заказе: проверьте, что в
$_POSTприходит полеconfirmation_code, и используетсяupdate_post_metaс правильным ID заказа. - Код не отображается в админке: убедитесь, что хук
woocommerce_admin_order_data_after_billing_addressне отключён и вывод происходит после загрузки заказа.
Практические советы по безопасности и производительности
- Не храните реальные коды подтверждения в открытом виде — рассмотрите хеширование или временное хранение в базе с ограничением срока действия.
- Для интеграции с SMS-провайдерами используйте асинхронные вызовы API, чтобы не замедлять процесс оформления заказа.
- Добавьте защиту от повторного использования кода, если это необходимо, через проверку в базе или сессии пользователя.
- Минимизируйте количество кастомных полей в оформлении заказа, чтобы не увеличивать нагрузку на процессинг.
Сравнение вариантов реализации поля подтверждения в WooCommerce
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код на PHP (как в статье) | Добавление поля и валидация через хуки WooCommerce | Контроль над логикой, нет лишних плагинов | Нужно писать и поддерживать код самостоятельно |
| Плагин «Checkout Field Editor» | Графический интерфейс для добавления полей | Удобно для новичков, быстрое добавление | Может быть недостаточно гибким для сложной валидации |
| Плагин со сторонней SMS-верификацией | Интеграция с внешними сервисами для подтверждения | Полная автоматизация и безопасность | Платно, сложность настройки, зависимость от сервиса |