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

Диагностика задачи: зачем добавлять дополнительные поля в заказы WooCommerce

Часто стандартных данных заказа WooCommerce недостаточно для бизнеса. Например, нужно сохранить номер паспорта, инструкцию для доставки или особые пожелания клиента. Добавить эти данные можно через дополнительные поля в админке заказа и на странице оформления.

Какие хуки использовать для добавления и сохранения полей

Для вывода полей в админке заказа используйте хук woocommerce_admin_order_data_after_billing_address. Для сохранения данных — woocommerce_process_shop_order_meta. Чтобы вывести поле на странице оформления, пригодится woocommerce_after_order_notes, а для сохранения — woocommerce_checkout_update_order_meta.

Пример добавления поля "Номер паспорта" в админке заказа

add_action('woocommerce_admin_order_data_after_billing_address', 'add_passport_field_to_admin_order', 10, 1);
function add_passport_field_to_admin_order($order){
    $passport = get_post_meta($order->get_id(), '_passport_number', true);
    echo '<p class="form-field form-field-wide"><label for="passport_number">Номер паспорта:</label> <input type="text" name="passport_number" id="passport_number" value="'.esc_attr($passport).'" /></p>';
}

add_action('woocommerce_process_shop_order_meta', 'save_passport_field_admin_order', 10, 2);
function save_passport_field_admin_order($order_id, $post){
    if(isset($_POST['passport_number'])){
        update_post_meta($order_id, '_passport_number', sanitize_text_field($_POST['passport_number']));
    }
}

Добавление поля на страницу оформления заказа

add_action('woocommerce_after_order_notes', 'add_passport_field_checkout');
function add_passport_field_checkout($checkout){
    woocommerce_form_field('passport_number', array(
        'type' => 'text',
        'class' => array('form-row-wide'),
        'label' => 'Номер паспорта',
        'placeholder' => 'Введите номер паспорта',
        'required' => false,
    ), $checkout->get_value('passport_number'));
}

add_action('woocommerce_checkout_update_order_meta', 'save_passport_field_checkout');
function save_passport_field_checkout($order_id){
    if(!empty($_POST['passport_number'])){
        update_post_meta($order_id, '_passport_number', sanitize_text_field($_POST['passport_number']));
    }
}

Проверка корректности после внедрения

  • Оформите тестовый заказ, заполните дополнительное поле на странице оформления.
  • В админке WooCommerce откройте заказ и убедитесь, что поле с номером паспорта отображается и содержит введённое значение.
  • Измените значение в админке и сохраните заказ — проверьте, что данные сохраняются.
  • Проверьте, что данные доступны через get_post_meta($order_id, '_passport_number', true) в шаблонах или других хуках.

Частые ошибки и способы их исправления

  • Поле не отображается в админке: проверьте, что хук woocommerce_admin_order_data_after_billing_address подключён правильно и функция не содержит синтаксических ошибок.
  • Данные не сохраняются: убедитесь, что имя поля в форме совпадает с ключом в $_POST и что используется корректная функция update_post_meta.
  • Ошибка при выводе поля на странице оформления: проверьте, что в функции используется woocommerce_form_field и передаётся объект $checkout.
  • Данные не сохраняются при оформлении: проверьте, что хук woocommerce_checkout_update_order_meta подключён и вызывается, а данные валидируются через sanitize_text_field.

Практические советы по безопасности и производительности

  • Всегда фильтруйте и санитизируйте данные из $_POST перед сохранением.
  • Для хранения чувствительных данных (например, паспортных данных) убедитесь, что доступ к админке ограничен и данные не выводятся на фронтенде без необходимости.
  • Если добавляете несколько полей, группируйте их по смыслу, чтобы не загружать интерфейс.
  • Для массовой работы с такими полями используйте кастомные мета-боксы, чтобы повысить удобство.

Сравнение способов добавления дополнительных полей

СпособПлюсыМинусыКогда использовать
Добавление через хуки WooCommerce (код)Лёгкая кастомизация, нет лишних плагинов, быстрый откликТребует навыков PHP, можно ошибиться в сохраненииДля одного-двух полей, уникальных для проекта
Плагины для кастомных полей (например, Advanced Custom Fields)Простота настройки, визуальный интерфейсДополнительная нагрузка, меньше гибкости в интеграции с заказамиЕсли нужно много полей и быстро без кода
Использование конструкторов заказов с полями (тип плагина)Полная визуальная настройка, поддержка обновленийМожет быть тяжёлым и дорогим, сложнее интегрировать с кастомным кодомДля крупных проектов с комплексными формами
WooCommerce: как автоматически удалить товар после продажи
27.06.2026
WooCommerce: как установить и настроить дополнительные поля для заказов
18.05.2026
Как отладить проблемы с выводом картинок в WordPress
27.01.2026
Как использовать хуки и фильтры в WordPress для кастомизации сайта
02.11.2025
Создание собственного плагина WordPress: полный гайд для разработчиков
11.11.2025