Диагностика задачи: зачем нужны дополнительные поля в форме оплаты WooCommerce
Часто при продаже товаров через WooCommerce возникает необходимость добавить дополнительные поля в форму оформления заказа (checkout), например, для сбора информации о доставке, пожеланий покупателя или юридических данных. Плагины есть, но они могут замедлять сайт или создавать конфликты. В этой статье расскажу, как добавить и обработать собственные поля программно, используя стандартные хуки WooCommerce.
Как добавить пользовательские поля в форму оформления заказа
Для добавления полей в форму оплаты используем хук woocommerce_checkout_fields. Он позволяет модифицировать массив полей, который выводится в форме.
Пример: добавим поле «Номер паспорта» в секцию «Дополнительная информация».
add_filter('woocommerce_checkout_fields', 'add_passport_field_to_checkout');
function add_passport_field_to_checkout($fields) {
$fields['order']['passport_number'] = array(
'type' => 'text',
'label' => 'Номер паспорта',
'placeholder' => 'Введите номер паспорта',
'required' => false,
'class' => array('form-row-wide'),
'clear' => true
);
return $fields;
}Что важно
- Ключ поля (здесь
passport_number) должен быть уникальным. - Секция
'order'— это дополнительная информация после адреса доставки. - Параметры поля — тип, метка, CSS-классы и обязательность.
Валидация пользовательских полей на сервере
Если поле обязательное, нужно проверить его заполнение. Для этого используем хук woocommerce_checkout_process.
add_action('woocommerce_checkout_process', 'validate_passport_field');
function validate_passport_field() {
if (isset($_POST['passport_number']) && empty(trim($_POST['passport_number']))) {
wc_add_notice('Пожалуйста, укажите номер паспорта.', 'error');
}
}Сохранение данных в заказе
Чтобы сохранить введённое значение, используем хук woocommerce_checkout_update_order_meta.
add_action('woocommerce_checkout_update_order_meta', 'save_passport_field');
function save_passport_field($order_id) {
if (!empty($_POST['passport_number'])) {
update_post_meta($order_id, '_passport_number', sanitize_text_field($_POST['passport_number']));
}
}Отображение поля в админке заказа и в письмах
Чтобы видеть значение в админке, добавьте следующий код:
add_action('woocommerce_admin_order_data_after_billing_address', 'display_passport_in_admin_order', 10, 1);
function display_passport_in_admin_order($order){
$passport = get_post_meta($order->get_id(), '_passport_number', true);
if ($passport) {
echo '<p><strong>Номер паспорта:</strong> ' . esc_html($passport) . '</p>';
}
}Для добавления в письмо оформленного заказа — используйте фильтр woocommerce_email_order_meta_fields:
add_filter('woocommerce_email_order_meta_fields', 'add_passport_to_email_order_meta', 10, 3);
function add_passport_to_email_order_meta($fields, $sent_to_admin, $order) {
$passport = get_post_meta($order->get_id(), '_passport_number', true);
if ($passport) {
$fields['passport_number'] = array(
'label' => 'Номер паспорта',
'value' => $passport
);
}
return $fields;
}Проверка результата после внедрения
- Зайдите на страницу оформления заказа, убедитесь, что поле «Номер паспорта» отображается в разделе «Дополнительная информация».
- Попробуйте оформить заказ с пустым полем, если оно обязательное — увидите ошибку.
- Завершите заказ с заполненным полем, затем в админке проверьте, что значение сохранено и отображается в карточке заказа.
- Проверьте, что поле выводится в письмах с информацией о заказе.
Частые ошибки и их исправление
- Поле не отображается в форме: Проверьте, что функция добавления поля подключена и хук
woocommerce_checkout_fieldsиспользуется правильно. Кэш сайта или плагина тоже может влиять — очистите. - Валидация не срабатывает: Убедитесь, что в
woocommerce_checkout_processпроверяется правильный ключ$_POSTи добавлена ошибка черезwc_add_notice(). - Данные не сохраняются: Проверьте, что используется
update_post_metaс корректным ID заказа и что поле не пустое. - Поле не видно в админке или письмах: Убедитесь, что используете правильные хуки и что название метаполя совпадает с тем, что сохраняется.
Практические советы по производительности и безопасности
- Фильтруйте и очищайте пользовательские данные через
sanitize_text_field()или другие функции в зависимости от типа поля. - Избегайте лишних сложных проверок на фронтенде — основная валидация должна быть на сервере.
- Если добавляете несколько полей, группируйте их в массивы с префиксами, чтобы избежать конфликтов с плагинами.
- Не используйте глобальные переменные без необходимости, передавайте данные через параметры функций и хук.
- Для сложных форм с логикой лучше использовать отдельные функции для обработки каждого блока полей.
Сравнение способов добавления пользовательских полей в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Добавление через плагины (Checkout Field Editor и др.) | Быстро, без кода, много настроек | Нагрузка на сайт, несовместимости, ограниченная кастомизация |
| Программное добавление через хуки (как в статье) | Контроль, производительность, гибкость | Требует навыков программирования, больше времени на отладку |