Диагностика проблемы: зачем и когда менять поля оформления заказа в WooCommerce
Частая задача — адаптировать форму оформления заказа под бизнес-требования: убрать ненужные поля, добавить новые, изменить порядок или обязательность полей. Это необходимо для повышения конверсии, сбора нужных данных и удобства пользователей.
Важно понимать, что WooCommerce использует массивы для описания полей, которые можно фильтровать и модифицировать через хук woocommerce_checkout_fields. Неправильное изменение полей может привести к ошибкам валидации или потере данных.
Пошаговое решение: изменение, удаление и добавление полей оформления заказа
1. Удаление ненужных полей
Чтобы убрать, например, поле «Компания» из биллинговых данных, используйте следующий код в functions.php вашей темы или в плагине для кастомизаций:
add_filter('woocommerce_checkout_fields', 'custom_remove_billing_company_field');
function custom_remove_billing_company_field($fields) {
unset($fields['billing']['billing_company']);
return $fields;
}2. Изменение обязательности и меток полей
Чтобы сделать поле «Телефон» не обязательным и изменить его метку:
add_filter('woocommerce_checkout_fields', 'custom_modify_billing_phone_field');
function custom_modify_billing_phone_field($fields) {
$fields['billing']['billing_phone']['required'] = false;
$fields['billing']['billing_phone']['label'] = 'Контактный телефон (не обязательно)';
return $fields;
}3. Добавление нового поля, например, «Номер договора»
Добавим кастомное поле в раздел биллинга и сохраним его:
add_filter('woocommerce_checkout_fields', 'custom_add_contract_number_field');
function custom_add_contract_number_field($fields) {
$fields['billing']['billing_contract_number'] = array(
'type' => 'text',
'label' => 'Номер договора',
'required' => false,
'class' => array('form-row-wide'),
'clear' => true
);
return $fields;
}
// Сохранение поля
add_action('woocommerce_checkout_update_order_meta', 'custom_save_contract_number_field');
function custom_save_contract_number_field($order_id) {
if (!empty($_POST['billing_contract_number'])) {
update_post_meta($order_id, '_billing_contract_number', sanitize_text_field($_POST['billing_contract_number']));
}
}
// Отображение в админке
add_action('woocommerce_admin_order_data_after_billing_address', 'custom_display_contract_number_admin_order', 10, 1);
function custom_display_contract_number_admin_order($order){
$contract_number = get_post_meta($order->get_id(), '_billing_contract_number', true);
if ($contract_number) {
echo '<p><strong>Номер договора:</strong> ' . esc_html($contract_number) . '</p>';
}
}Проверка результата после внедрения изменений
- Откройте страницу оформления заказа и проверьте, что поля изменились согласно внесённым правкам: ненужных полей нет, новые поля отображаются.
- Попробуйте оформить заказ с заполнением новых полей, проверьте, что данные сохраняются и отображаются в админке WooCommerce (в карточке заказа).
- Обратите внимание на валидацию: обязательные поля должны корректно требовать заполнения.
Частые ошибки и как их исправить
- Ошибка: Поле не отображается на форме.
Причина: Неправильный ключ массива, например, «billing_contract» вместо «billing_contract_number».
Решение: Проверьте правильность ключа и структуру массива. - Ошибка: Данные не сохраняются в заказе.
Причина: Отсутствие обработчика сохранения данных черезwoocommerce_checkout_update_order_meta.
Решение: Добавьте функцию сохранения, как показано в примере. - Ошибка: Поля не проходят валидацию, хотя должны быть необязательными.
Причина: В поле не указан параметр'required' => false.
Решение: Явно укажите обязательность поля.
Практические советы по производительности и безопасности
- Не используйте
print_rиvar_dumpдля отладки на боевом сайте — лучше подключить WP_DEBUG_LOG. - Санитизируйте все пользовательские данные при сохранении: используйте
sanitize_text_field()или более подходящие функции. - Если добавляете много полей, группируйте их по разделам, чтобы не создавать перегруженную форму и не ухудшать UX.
- Для сложных изменений рассмотрите создание дочерней темы или собственного плагина для кастомизаций, чтобы не потерять правки при обновлении.
Сравнение способов изменения полей оформления заказа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Фильтр woocommerce_checkout_fields | Изменение массива полей | Гибко, просто внедрять | Может потребоваться дополнительный код для сохранения и отображения |
| Плагины кастомизации checkout | Использование готовых плагинов (Checkout Field Editor и др.) | Удобный UI, быстрое добавление | Меньше контроля, нагрузка на сайт, возможны конфликты |
| Полное переопределение шаблонов | Создание собственного шаблона checkout | Максимальный контроль над формой | Сложно поддерживать, не подходит для мелких правок |