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

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

Часто при продаже товаров через WooCommerce возникает необходимость добавить дополнительные поля в форму оформления заказа (checkout), например, для сбора информации о доставке, пожеланий покупателя или юридических данных. Плагины есть, но они могут замедлять сайт или создавать конфликты. В этой статье расскажу, как добавить и обработать собственные поля программно, используя стандартные хуки WooCommerce.

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

Для добавления полей в форму оплаты используем хук woocommerce_checkout_fields. Он позволяет модифицировать массив полей, который выводится в форме.

Пример: добавим поле «Номер паспорта» в секцию «Дополнительная информация».

add_filter('woocommerce_checkout_fields', 'add_passport_field_to_checkout');
function add_passport_field_to_checkout($fields) {
    $fields['order']['passport_number'] = array(
        'type'        => 'text',
        'label'       => 'Номер паспорта',
        'placeholder' => 'Введите номер паспорта',
        'required'    => false,
        'class'       => array('form-row-wide'),
        'clear'       => true
    );
    return $fields;
}

Что важно

  • Ключ поля (здесь passport_number) должен быть уникальным.
  • Секция 'order' — это дополнительная информация после адреса доставки.
  • Параметры поля — тип, метка, CSS-классы и обязательность.

Валидация пользовательских полей на сервере

Если поле обязательное, нужно проверить его заполнение. Для этого используем хук woocommerce_checkout_process.

add_action('woocommerce_checkout_process', 'validate_passport_field');
function validate_passport_field() {
    if (isset($_POST['passport_number']) && empty(trim($_POST['passport_number']))) {
        wc_add_notice('Пожалуйста, укажите номер паспорта.', 'error');
    }
}

Сохранение данных в заказе

Чтобы сохранить введённое значение, используем хук woocommerce_checkout_update_order_meta.

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

Отображение поля в админке заказа и в письмах

Чтобы видеть значение в админке, добавьте следующий код:

add_action('woocommerce_admin_order_data_after_billing_address', 'display_passport_in_admin_order', 10, 1);
function display_passport_in_admin_order($order){
    $passport = get_post_meta($order->get_id(), '_passport_number', true);
    if ($passport) {
        echo '<p><strong>Номер паспорта:</strong> ' . esc_html($passport) . '</p>';
    }
}

Для добавления в письмо оформленного заказа — используйте фильтр woocommerce_email_order_meta_fields:

add_filter('woocommerce_email_order_meta_fields', 'add_passport_to_email_order_meta', 10, 3);
function add_passport_to_email_order_meta($fields, $sent_to_admin, $order) {
    $passport = get_post_meta($order->get_id(), '_passport_number', true);
    if ($passport) {
        $fields['passport_number'] = array(
            'label' => 'Номер паспорта',
            'value' => $passport
        );
    }
    return $fields;
}

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

  • Зайдите на страницу оформления заказа, убедитесь, что поле «Номер паспорта» отображается в разделе «Дополнительная информация».
  • Попробуйте оформить заказ с пустым полем, если оно обязательное — увидите ошибку.
  • Завершите заказ с заполненным полем, затем в админке проверьте, что значение сохранено и отображается в карточке заказа.
  • Проверьте, что поле выводится в письмах с информацией о заказе.

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

  • Поле не отображается в форме: Проверьте, что функция добавления поля подключена и хук woocommerce_checkout_fields используется правильно. Кэш сайта или плагина тоже может влиять — очистите.
  • Валидация не срабатывает: Убедитесь, что в woocommerce_checkout_process проверяется правильный ключ $_POST и добавлена ошибка через wc_add_notice().
  • Данные не сохраняются: Проверьте, что используется update_post_meta с корректным ID заказа и что поле не пустое.
  • Поле не видно в админке или письмах: Убедитесь, что используете правильные хуки и что название метаполя совпадает с тем, что сохраняется.

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

  • Фильтруйте и очищайте пользовательские данные через sanitize_text_field() или другие функции в зависимости от типа поля.
  • Избегайте лишних сложных проверок на фронтенде — основная валидация должна быть на сервере.
  • Если добавляете несколько полей, группируйте их в массивы с префиксами, чтобы избежать конфликтов с плагинами.
  • Не используйте глобальные переменные без необходимости, передавайте данные через параметры функций и хук.
  • Для сложных форм с логикой лучше использовать отдельные функции для обработки каждого блока полей.

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

МетодПлюсыМинусы
Добавление через плагины (Checkout Field Editor и др.)Быстро, без кода, много настроекНагрузка на сайт, несовместимости, ограниченная кастомизация
Программное добавление через хуки (как в статье)Контроль, производительность, гибкостьТребует навыков программирования, больше времени на отладку
Как использовать WPCommunity для создания форума в WordPress
21.12.2025
Как автоматизировать удаление старых записей в WordPress
28.01.2026
Как избежать конфликтов между плагинами в WordPress
13.03.2026
Как создать автоматические отказы по формам в WordPress
04.03.2026
Как создать собственный REST API endpoint в WordPress
15.11.2025

Уроки со скриншотами, подробные руководства