Диагностика задачи: зачем и когда нужно добавлять дополнительные поля
В стандартной форме оформления заказа WooCommerce представлены основные поля: имя, адрес, контактная информация, способ оплаты и доставки. Часто возникает необходимость собрать дополнительную информацию от клиента, например, индивидуальные пожелания, номер партнера, дату события или комментарии к заказу. Стандартные настройки WooCommerce не позволяют добавлять произвольные поля без вмешательства в код или использования плагинов. В этой статье разберём, как добавить дополнительное поле в форму оформления заказа программно, без сторонних плагинов.
Как добавить дополнительное поле в форму оформления заказа WooCommerce
Шаг 1. Добавление поля на страницу оформления заказа
Для добавления пользовательского поля используется хук woocommerce_checkout_fields, который позволяет модифицировать массив полей формы. В нашем примере добавим текстовое поле с меткой "Номер партнера":
add_filter('woocommerce_checkout_fields', 'add_custom_checkout_field');
function add_custom_checkout_field($fields) {
$fields['billing']['billing_partner_number'] = array(
'type' => 'text',
'label' => 'Номер партнера',
'placeholder' => 'Введите номер партнера',
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
'priority' => 120,
);
return $fields;
}Поле добавится в блок с биллингом после стандартных полей, благодаря параметру priority.
Шаг 2. Валидация введённых данных
Если поле обязательное, следует добавить валидацию. Пример для обязательного поля "Номер партнера":
add_action('woocommerce_checkout_process', 'validate_partner_number_field');
function validate_partner_number_field() {
if (isset($_POST['billing_partner_number']) && empty(trim($_POST['billing_partner_number']))) {
wc_add_notice('Пожалуйста, укажите номер партнера.', 'error');
}
}Шаг 3. Сохранение значения поля в метаданные заказа
Чтобы данные сохранялись в заказе, нужно обработать сохранение:
add_action('woocommerce_checkout_update_order_meta', 'save_partner_number_order_meta');
function save_partner_number_order_meta($order_id) {
if (!empty($_POST['billing_partner_number'])) {
update_post_meta($order_id, '_billing_partner_number', sanitize_text_field($_POST['billing_partner_number']));
}
}Шаг 4. Отображение дополнительного поля в админке заказа
Чтобы увидеть поле в админке WooCommerce (редактирование заказа), добавим следующий код:
add_action('woocommerce_admin_order_data_after_billing_address', 'display_partner_number_admin_order_meta', 10, 1);
function display_partner_number_admin_order_meta($order){
$partner_number = get_post_meta($order->get_id(), '_billing_partner_number', true);
if ($partner_number) {
echo '<p><strong>Номер партнера:</strong> ' . esc_html($partner_number) . '</p>';
}
}Проверка результата после внедрения
- Перейдите на страницу оформления заказа, убедитесь, что новое поле отображается.
- Заполните форму, введите тестовое значение, оформите заказ.
- В админке WooCommerce откройте заказ, проверьте, отображается ли введённое значение дополнительного поля.
- При добавлении валидации попробуйте отправить форму с пустым полем и проверьте вывод ошибки.
Частые ошибки и как их исправить
- Поле не отображается на странице оформления заказа. Проверьте, что код добавлен в файл
functions.phpактивной темы или в плагин, и что нет синтаксических ошибок. - Данные не сохраняются в заказе. Убедитесь, что имя поля в
$_POSTсовпадает с тем, что добавлено в массив полей. - Ошибка валидации не срабатывает. Проверьте, что хук
woocommerce_checkout_processкорректно подключён и функция вызывается. - Поле отображается, но не сохраняется или не выводится в админке. Проверьте правильность использования функции
update_post_metaи получение данных черезget_post_meta.
Практические советы по безопасности и производительности
- Всегда используйте функции очистки данных перед сохранением:
sanitize_text_field,esc_htmlпри выводе. - Не делайте поле обязательным, если это не критично, чтобы не мешать оформлению заказа.
- Для большого количества дополнительных полей рассмотрите вариант создания отдельного мета-бокса или использования плагинов типа Advanced Custom Fields с интеграцией в WooCommerce.
- Проверяйте совместимость с WooCommerce и темой после обновлений.
Сравнение способов добавления дополнительного поля
| Способ | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Полный контроль, нет зависимости от плагинов, лёгкость настройки | Требует навыков разработки, риск ошибок, поддержка при обновлениях темы |
| Плагины (например, Checkout Field Editor) | Удобный интерфейс, быстрая настройка, нет необходимости кодить | Дополнительная нагрузка, возможные конфликты, ограниченная кастомизация |