wpcorp.ru wordpress WP Corp

WooCommerce: как использовать хуки для изменения формы оформления заказа

Диагностика задачи: зачем менять форму оформления заказа в 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 и аналоги
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙