Диагностика задачи: зачем менять форму оформления заказа в WooCommerce
Стандартная форма оформления заказа в WooCommerce подходит не всегда. Часто требуется добавить, убрать или изменить поля — например, добавить поле для ИНН, убрать поле «Факс» или изменить подписи. WooCommerce предоставляет набор хуков и фильтров для кастомизации без правки шаблонов.
Если вы хотите модифицировать форму оформления заказа, первым делом нужно понять, какие именно изменения нужны:
- Добавить новое поле;
- Изменить существующее поле (метку, обязательность, порядок);
- Удалить ненужное поле;
- Изменить валидацию поля;
- Обработать и сохранить новое поле в заказе.
Основные хуки для кастомизации полей оформления заказа
В WooCommerce поля оформления заказа представлены в массиве $fields, который можно модифицировать через фильтр woocommerce_checkout_fields. Это основной инструмент для управления полями.
Пример: удаление поля «Факс»
add_filter('woocommerce_checkout_fields', 'remove_checkout_fax_field');
function remove_checkout_fax_field($fields) {
unset($fields['billing']['billing_fax']);
return $fields;
}
Этот код уберёт поле «Факс» из раздела «Платёжные данные».
Пример: добавление пользовательского поля ИНН
add_filter('woocommerce_checkout_fields', 'add_inn_checkout_field');
function add_inn_checkout_field($fields) {
$fields['billing']['billing_inn'] = array(
'type' => 'text',
'label' => 'ИНН',
'required' => true,
'class' => array('form-row-wide'),
'priority' => 120,
);
return $fields;
}
Валидация и сохранение новых полей
Валидация поля ИНН
Чтобы сделать поле обязательным и проверить формат, используйте хук woocommerce_checkout_process:
add_action('woocommerce_checkout_process', 'validate_inn_field');
function validate_inn_field() {
if (empty($_POST['billing_inn'])) {
wc_add_notice('Пожалуйста, введите ИНН.', 'error');
} elseif (!preg_match('/^\d{10,12}$/', $_POST['billing_inn'])) {
wc_add_notice('ИНН должен содержать 10 или 12 цифр.', 'error');
}
}
Сохранение поля в метаданные заказа
Для сохранения значения добавленного поля используйте хук woocommerce_checkout_update_order_meta:
add_action('woocommerce_checkout_update_order_meta', 'save_inn_field_meta');
function save_inn_field_meta($order_id) {
if (!empty($_POST['billing_inn'])) {
update_post_meta($order_id, '_billing_inn', sanitize_text_field($_POST['billing_inn']));
}
}
Отображение поля ИНН в админке заказа
add_action('woocommerce_admin_order_data_after_billing_address', 'display_inn_in_admin_order', 10, 1);
function display_inn_in_admin_order($order) {
$inn = get_post_meta($order->get_id(), '_billing_inn', true);
if ($inn) {
echo '<p><strong>ИНН:</strong> ' . esc_html($inn) . '</p>';
}
}
Проверка результата после внедрения
Чтобы убедиться, что изменения работают как задумано:
- Перейдите на страницу оформления заказа, проверьте наличие/отсутствие полей;
- Попробуйте оформить заказ с пустым или неправильным ИНН — должна сработать валидация;
- После успешного оформления заказа перейдите в админку WooCommerce → Заказы и откройте заказ — проверьте, что ИНН отображается в метаданных;
- Проверьте, что другие поля не пострадали и форма работает без ошибок.
Частые ошибки при кастомизации формы оформления заказа
- Ошибка: поле не сохраняется в заказе.
Причина: не использован хукwoocommerce_checkout_update_order_metaили неправильно обработаны данные из$_POST. - Ошибка: валидация не срабатывает.
Причина: забыли добавить уведомления черезwc_add_noticeвwoocommerce_checkout_process. - Ошибка: поле не отображается в админке.
Причина: не добавлен вывод через хукwoocommerce_admin_order_data_after_billing_addressили неправильный ключ метаданных. - Ошибка: конфликт при использовании плагинов, изменяющих форму оформления.
Причина: плагин переопределяет те же поля — используйте приоритеты хуков или дочернюю тему для приоритетной загрузки своих изменений.
Практические советы по безопасности и производительности
- Всегда используйте
sanitize_text_fieldпри сохранении данных из формы для защиты от XSS и инъекций. - Проверяйте наличие и валидность данных перед сохранением.
- Не перегружайте форму лишними полями — это ухудшает UX и может повлиять на конверсию.
- Для сложных изменений используйте дочернюю тему или плагин, чтобы не потерять свои настройки при обновлении WooCommerce.
- Тестируйте изменения на staging-сервере, чтобы избежать сбоев на живом сайте.
Сравнение способов добавления поля в форму оформления заказа
| Метод | Преимущества | Недостатки | Пример использования |
|---|---|---|---|
Фильтр woocommerce_checkout_fields | Простой, гибкий, не требует правки шаблонов | Ограничен структурой массива полей | Добавление/удаление полей |
| Переопределение шаблонов оформления заказа | Полный контроль над разметкой | Требует поддержки и обновления шаблонов | Изменение HTML и JS формы |
| Плагины для кастомизации формы | Быстрое решение без кода | Могут замедлить сайт, конфликты с темами | WooCommerce Checkout Field Editor и аналоги |