Диагностика задачи: зачем и когда нужны собственные поля в оформлении заказа WooCommerce
В стандартной форме оформления заказа WooCommerce есть базовые поля: имя, адрес, телефон, email и т.д. Но часто требуется добавить дополнительную информацию от покупателя, например, номер налогоплательщика, дату доставки, особые инструкции или комментарии, которые не входят в стандартный набор. Собственные поля позволяют гибко собирать нужные данные прямо на этапе оформления заказа.
Часто сталкиваемся с такими вопросами:
- Как добавить новое поле в раздел биллинга или доставки;
- Как сохранить данные в заказе и вывести их в админке;
- Как сделать поле обязательным;
- Как отобразить данные в email уведомлениях и на странице заказа пользователя.
Пошаговое решение: добавляем собственное поле в оформление заказа
1. Добавляем поле на страницу оформления заказа
Используем хук woocommerce_checkout_fields для добавления своего поля. В примере добавим поле «Номер налогоплательщика» в биллинговую часть:
add_filter('woocommerce_checkout_fields', 'add_tax_number_checkout_field');
function add_tax_number_checkout_field($fields) {
$fields['billing']['billing_tax_number'] = array(
'type' => 'text',
'label' => __('Номер налогоплательщика', 'woocommerce'),
'placeholder' => __('Введите ИНН', 'woocommerce'),
'required' => true,
'class' => array('form-row-wide'),
'clear' => true,
'priority' => 120,
);
return $fields;
}2. Проверяем обязательность поля при отправке формы
Чтобы не пропускать пустой ввод, используем хук woocommerce_checkout_process:
add_action('woocommerce_checkout_process', 'validate_tax_number_field');
function validate_tax_number_field() {
if (empty($_POST['billing_tax_number'])) {
wc_add_notice(__('Пожалуйста, введите номер налогоплательщика.'), 'error');
}
}3. Сохраняем данные в мета заказа
Используем хук woocommerce_checkout_update_order_meta:
add_action('woocommerce_checkout_update_order_meta', 'save_tax_number_order_meta');
function save_tax_number_order_meta($order_id) {
if (!empty($_POST['billing_tax_number'])) {
update_post_meta($order_id, '_billing_tax_number', sanitize_text_field($_POST['billing_tax_number']));
}
}4. Отображаем поле в админке заказа
Добавим вывод в метабоксе заказа в админке с помощью хука woocommerce_admin_order_data_after_billing_address:
add_action('woocommerce_admin_order_data_after_billing_address', 'display_tax_number_admin_order', 10, 1);
function display_tax_number_admin_order($order) {
$tax_number = get_post_meta($order->get_id(), '_billing_tax_number', true);
if ($tax_number) {
echo '<p><strong>' . __('Номер налогоплательщика') . ':</strong> ' . esc_html($tax_number) . '</p>';
}
}5. Показываем поле в email уведомлениях
Для этого используем фильтр woocommerce_email_order_meta_fields:
add_filter('woocommerce_email_order_meta_fields', 'add_tax_number_to_email');
function add_tax_number_to_email($fields) {
$fields['billing_tax_number'] = array(
'label' => __('Номер налогоплательщика'),
'value' => get_post_meta(wc_get_order()->get_id(), '_billing_tax_number', true),
);
return $fields;
}Проверка результата после внедрения
- Перейдите на страницу оформления заказа и убедитесь, что появилось новое поле с нужной меткой.
- Попробуйте отправить форму без заполнения — должна появиться ошибка.
- Оформите заказ с заполненным полем.
- В админке откройте заказ — поле с вашим значением должно отображаться в блоке с адресом.
- Проверьте email уведомление — в нем должно быть отображено новое поле.
Частые ошибки и как их исправить
- Поле не отображается на сайте: Проверьте, что функция добавления поля подключена в файле functions.php или в плагине, и что хук
woocommerce_checkout_fieldsне переопределяется другим кодом. - Ошибка не возникает при пустом поле: Убедитесь, что используете хук
woocommerce_checkout_process, а неinit, и что в$_POSTприходит правильное имя поля. - Данные не сохраняются: Проверьте, что в функции сохранения используется sanitize и корректное имя поля, а также что хук
woocommerce_checkout_update_order_metaподключен. - Поле не отображается в email: В фильтре
woocommerce_email_order_meta_fieldsубедитесь, что передается правильный ID заказа и поле существует в мета.
Практические советы по безопасности и производительности
- Очистка данных: всегда используйте функции
sanitize_text_fieldили аналогичные для очистки пользовательского ввода перед сохранением. - Безопасность: не выводите данные напрямую без экранирования — используйте
esc_htmlпри выводе в админке и на фронтенде. - Производительность: не перегружайте форму большим количеством сложных полей, чтобы не замедлять загрузку страницы оформления заказа.
- Совместимость: проверяйте конфликты с другими плагинами, особенно если они тоже работают с формой оформления заказа.
Сравнение способов добавления полей: код vs плагины
| Метод | Преимущества | Недостатки |
|---|---|---|
| Добавление кода вручную | Полный контроль, минимум зависимостей, легко кастомизировать | Требует знаний PHP, можно допустить ошибки |
| Использование плагинов (например, Checkout Field Editor) | Простота установки, визуальное редактирование, быстрый старт | Дополнительная нагрузка, возможны конфликты, ограниченная кастомизация без доп. кода |