Зачем добавлять поле подтверждения кода в WooCommerce
Добавление поля для ввода кода подтверждения (например, промокода, кода акции или специального идентификатора) на странице оформления заказа помогает контролировать доступ к скидкам, бонусам или специальным предложениям. Такая настройка полезна для магазинов с ограниченными акциями или для интеграции с внешними системами, требующими дополнительной валидации.
Диагностика задачи: что надо учесть перед реализацией
- Какое именно значение будет вводить пользователь и в каком формате.
- Когда и как проверять введённый код: сразу при отправке формы или в момент создания заказа.
- Как отобразить ошибку, если код некорректный.
- Как сохранить значение в метаданных заказа для дальнейшей обработки.
- Влияние на производительность и UX: не стоит перегружать форму лишними проверками.
Пошаговое решение: добавляем и обрабатываем поле подтверждения
1. Добавляем поле на страницу оформления заказа
Для этого используем хук woocommerce_after_order_notes и функцию woocommerce_form_field():
add_action('woocommerce_after_order_notes', 'add_confirmation_code_field_to_checkout');
function add_confirmation_code_field_to_checkout($checkout) {
woocommerce_form_field('confirmation_code', array(
'type' => 'text',
'class' => array('confirmation-code form-row-wide'),
'label' => __('Код подтверждения'),
'placeholder' => __('Введите код подтверждения'),
'required' => false,
), $checkout->get_value('confirmation_code'));
}2. Валидация поля при отправке формы
Проверяем введённый код в хуке woocommerce_checkout_process:
add_action('woocommerce_checkout_process', 'validate_confirmation_code_field');
function validate_confirmation_code_field() {
if (!empty($_POST['confirmation_code'])) {
$code = sanitize_text_field($_POST['confirmation_code']);
// Пример логики проверки: код должен быть "WPTO2024"
if ($code !== 'WPTO2024') {
wc_add_notice(__('Неверный код подтверждения.'), 'error');
}
}
}3. Сохраняем значение в метаданных заказа
Используем хук woocommerce_checkout_update_order_meta:
add_action('woocommerce_checkout_update_order_meta', 'save_confirmation_code_order_meta');
function save_confirmation_code_order_meta($order_id) {
if (!empty($_POST['confirmation_code'])) {
update_post_meta($order_id, '_confirmation_code', sanitize_text_field($_POST['confirmation_code']));
}
}4. Отображаем код подтверждения в админке заказа
Добавим вывод в метабоксе заказа с помощью woocommerce_admin_order_data_after_billing_address:
add_action('woocommerce_admin_order_data_after_billing_address', 'display_confirmation_code_admin_order_meta', 10, 1);
function display_confirmation_code_admin_order_meta($order) {
$code = get_post_meta($order->get_id(), '_confirmation_code', true);
if ($code) {
echo '<p><strong>Код подтверждения:</strong> ' . esc_html($code) . '</p>';
}
}Проверка результата после внедрения
- Откройте страницу оформления заказа, убедитесь, что появилось новое поле "Код подтверждения".
- Попробуйте ввести неправильный код — должна появиться ошибка и нельзя оформить заказ.
- Ввод правильного кода должен пройти без ошибок и заказ будет создан.
- В админке WooCommerce в карточке заказа проверьте, что значение кода отображается в разделе с данными покупателя.
Частые ошибки и как их исправить
- Поле не отображается: проверьте, что хук
woocommerce_after_order_notesне конфликтует с темой или другими плагинами. Попробуйте заменить наwoocommerce_checkout_fieldsдля вставки поля. - Ошибка валидации не показывается: убедитесь, что функция
wc_add_notice()вызывается до сохранения заказа и не подавляется другими хуками. - Данные не сохраняются в заказе: проверьте, что используете правильный хук
woocommerce_checkout_update_order_metaи ключ метаданных уникален (лучше начинать с подчеркивания). - Невозможно увидеть код в админке: убедитесь, что функция вывода подключена к правильному хуку и что заказ действительно содержит метаданные.
Практические советы по безопасности и производительности
- Всегда используйте
sanitize_text_field()для очистки входящих данных. - Не делайте поле обязательным, если код не всегда нужен, чтобы не отпугнуть покупателей.
- Для сложной логики проверки кода используйте кэширование или загрузку списка валидных кодов из базы или внешнего API, чтобы избежать задержек.
- Если планируете использовать много различных кодов, рассмотрите создание отдельной таблицы или пользовательского типа записи для управления ими.
Сравнение способов реализации поля подтверждения кода
| Метод | Плюсы | Минусы |
|---|---|---|
Добавление через хук woocommerce_after_order_notes | Простой и быстрый способ, подходит для большинства тем. | Возможны конфликты с темами, не всегда подходит для сложных форм. |
Использование фильтра woocommerce_checkout_fields | Гибкость в изменении порядка и типа полей. | Требует более глубокого понимания структуры полей WooCommerce. |
| Плагин для кастомизации полей оформления заказа | Не требует кода, управление через UI. | Дополнительная нагрузка, ограниченная гибкость без кода. |