Диагностика задачи: зачем кастомизировать поля оформления заказа WooCommerce
Часто стандартных полей оформления заказа WooCommerce недостаточно: бизнес требует добавить дополнительные данные от клиента, например, ИНН, дату монтажа или комментарии. Аналогично, нужно иногда убрать ненужные поля, чтобы упростить форму и повысить конверсию. Использование плагинов увеличивает нагрузку и требует постоянного обновления, поэтому оптимально применять кастомный код в functions.php или в собственном плагине.
Как добавить новое поле в оформление заказа WooCommerce
Для добавления поля на страницу оформления заказа применяется фильтр woocommerce_checkout_fields. Ниже пример добавления текстового поля "ИНН" в секцию с биллинговой информацией.
add_filter('woocommerce_checkout_fields', 'wpmarketing_add_custom_checkout_field');
function wpmarketing_add_custom_checkout_field($fields) {
$fields['billing']['billing_inn'] = array(
'type' => 'text',
'label' => 'ИНН',
'placeholder' => 'Введите ИНН',
'required' => false,
'class' => array('form-row-wide'),
'clear' => true
);
return $fields;
}
Обратите внимание, что ключ поля должен начинаться с префикса billing_, shipping_ или order_ для корректной обработки WooCommerce.
Сохранение значения нового поля в метаданных заказа
Чтобы данные сохранялись и отображались в админке, нужно использовать действие woocommerce_checkout_update_order_meta:
add_action('woocommerce_checkout_update_order_meta', 'wpmarketing_save_custom_checkout_field');
function wpmarketing_save_custom_checkout_field($order_id) {
if (!empty($_POST['billing_inn'])) {
update_post_meta($order_id, '_billing_inn', sanitize_text_field($_POST['billing_inn']));
}
}
Отображение поля в админке заказа и в письмах
Чтобы поле отображалось в админке, используйте хук woocommerce_admin_order_data_after_billing_address:
add_action('woocommerce_admin_order_data_after_billing_address', 'wpmarketing_display_custom_field_admin_order', 10, 1);
function wpmarketing_display_custom_field_admin_order($order){
$inn = get_post_meta($order->get_id(), '_billing_inn', true);
if ($inn) {
echo '<p><strong>ИНН:</strong> ' . esc_html($inn) . '</p>';
}
}
Для отображения в письмах подключите фильтр woocommerce_email_order_meta_fields:
add_filter('woocommerce_email_order_meta_fields', 'wpmarketing_add_custom_field_to_emails');
function wpmarketing_add_custom_field_to_emails($fields) {
$fields['billing_inn'] = array(
'label' => 'ИНН',
'value' => get_post_meta(get_the_ID(), '_billing_inn', true),
);
return $fields;
}
Как удалить поля из оформления заказа WooCommerce
Для удаления полей используется тот же фильтр woocommerce_checkout_fields. Ниже пример удаления поля "Company" и "Address 2":
add_filter('woocommerce_checkout_fields', 'wpmarketing_remove_checkout_fields');
function wpmarketing_remove_checkout_fields($fields) {
unset($fields['billing']['billing_company']);
unset($fields['billing']['billing_address_2']);
return $fields;
}
Проверка результата удаления
Обновите страницу оформления заказа и убедитесь, что поля отсутствуют. Если поля остались, проверьте очередь фильтров и возможные конфликты с плагинами или темой.
Проверка правильности внедрения
- Добавьте тестовый заказ, заполните новое поле «ИНН» и завершите оформление.
- В админке заказа проверьте, что значение поля отображается правильно.
- Отправьте тестовый заказ, чтобы убедиться, что поле отображается в письме клиенту и администратору.
- Перейдите на страницу оформления заказа и убедитесь, что удалённые поля отсутствуют.
Частые ошибки и как их исправить
- Поле не сохраняется в заказе: проверьте правильность имени поля в
$_POSTи соответствие ключа с префиксомbilling_,shipping_илиorder_. - Поле не отображается в админке: убедитесь, что используете правильный хук
woocommerce_admin_order_data_after_billing_addressили аналогичный. - Удалённое поле всё ещё видно: проверьте, нет ли конфликтов с плагинами, которые могут добавлять поля повторно.
- Поля не валидируются: добавьте валидацию через хук
woocommerce_checkout_processесли поле обязательное.
Практические советы по безопасности и производительности
- Обязательно используйте функции очистки данных, например,
sanitize_text_field, перед сохранением. - Избегайте дублирования кода — выделяйте функции для повторно используемых частей.
- Для сложных форм с большим количеством полей лучше использовать AJAX-валидацию для улучшения UX.
- Минимизируйте количество кастомных полей, чтобы не ухудшать производительность оформления заказа.
Сравнение способов кастомизации полей оформления заказа
| Метод | Плюсы | Минусы | Применение |
|---|---|---|---|
| Код в functions.php | Полный контроль, нет лишних плагинов | Требует навыков, ошибки влияют на сайт | Малые и средние правки |
| Плагины кастомизации полей | Удобство, готовые интерфейсы | Нагрузка, возможные конфликты | Большие проекты, часто меняющиеся поля |
| Использование плагинов типа Clearfy Pro | Оптимизация и чистка сайта | Не всегда гибко для кастомных полей | Оптимизация и SEO |