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

Почему нужно добавить дополнительное поле в форму оформления заказа WooCommerce

Стандартная форма оформления заказа WooCommerce покрывает базовые потребности, но часто возникает задача собрать дополнительную информацию от клиента — например, номер налогоплательщика, комментарий к заказу, дату доставки и т.д. Добавление кастомного поля позволяет расширить функциональность магазина без установки дополнительных плагинов.

Диагностика: определяем требования к дополнительному полю

Перед внесением изменений важно четко понимать:

  • Какого типа данные нужны (текст, дата, выбор из списка);
  • Обязательно ли поле для заполнения;
  • В какой момент нужно показать поле (на этапе оформления, в личном кабинете, в админке заказа);
  • Как использовать данные поля (сохранить в мета заказа, отобразить в письмах, использовать в логике обработки).

Пошаговое добавление дополнительного поля в WooCommerce

1. Добавление поля в форму оформления заказа

Добавим текстовое поле «ИНН покупателя» в раздел с адресом доставки:

add_action('woocommerce_after_order_notes', 'wpone_add_custom_checkout_field');
function wpone_add_custom_checkout_field( $checkout ) {
    echo '<div id="wpone_custom_checkout_field">';
    woocommerce_form_field( 'wpone_inn', array(
        'type'          => 'text',
        'class'         => array('wpone-field form-row-wide'),
        'label'         => __('ИНН покупателя'),
        'placeholder'   => __('Введите ИНН'),
        'required'      => true,
    ), $checkout->get_value( 'wpone_inn' ) );
    echo '</div>';
}

2. Валидация введенного значения

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

add_action('woocommerce_checkout_process', 'wpone_validate_custom_checkout_field');
function wpone_validate_custom_checkout_field() {
    if ( ! $_POST['wpone_inn'] || ! preg_match('/^\d{10,12}$/', $_POST['wpone_inn']) ) {
        wc_add_notice( __('Пожалуйста, введите корректный ИНН (10 или 12 цифр).'), 'error' );
    }
}

3. Сохранение значения в метаданных заказа

Данные из поля нужно сохранить в заказ для последующего использования:

add_action('woocommerce_checkout_update_order_meta', 'wpone_save_custom_checkout_field');
function wpone_save_custom_checkout_field( $order_id ) {
    if ( ! empty( $_POST['wpone_inn'] ) ) {
        update_post_meta( $order_id, '_wpone_inn', sanitize_text_field( $_POST['wpone_inn'] ) );
    }
}

4. Отображение поля в админке заказа

Чтобы менеджеры видели значение ИНН, добавим его в детали заказа в админке:

add_action('woocommerce_admin_order_data_after_billing_address', 'wpone_display_custom_field_admin_order', 10, 1);
function wpone_display_custom_field_admin_order($order){
    $inn = get_post_meta( $order->get_id(), '_wpone_inn', true );
    if ( $inn ) {
        echo '<p><strong>ИНН покупателя:</strong> ' . esc_html( $inn ) . '</p>';
    }
}

5. Отображение дополнительного поля в письмах

Чтобы клиент и администратор видели ИНН в письме с подтверждением, добавим поле в тело письма:

add_action('woocommerce_email_customer_details', 'wpone_add_custom_field_to_email', 20, 3);
function wpone_add_custom_field_to_email( $order, $sent_to_admin, $plain_text ) {
    $inn = get_post_meta( $order->get_id(), '_wpone_inn', true );
    if ( $inn ) {
        if ( $plain_text ) {
            echo "\nИНН покупателя: {$inn}\n";
        } else {
            echo "<p><strong>ИНН покупателя:</strong> " . esc_html( $inn ) . "</p>";
        }
    }
}

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

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

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

  • Поле не показывается в форме оформления заказа: проверьте, что хук woocommerce_after_order_notes подходит вашей теме и версии WooCommerce, попробуйте заменить на woocommerce_checkout_fields или другой хук.
  • Валидация не срабатывает: убедитесь, что функция валидации подключена к хуку woocommerce_checkout_process и что поле передается в $_POST с правильным ключом.
  • Данные не сохраняются: проверьте, что в функции сохранения используется правильный ключ и что вызывается хук woocommerce_checkout_update_order_meta.
  • Поле не отображается в письмах: убедитесь, что хук woocommerce_email_customer_details используется правильно и что вывод учитывает формат письма (html/plain).

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

  • Всегда очищайте и проверяйте пользовательский ввод перед сохранением (sanitize_text_field, регулярные выражения).
  • Используйте минимально необходимые хуки, чтобы не влиять на производительность оформления заказа.
  • Для сложных форм и большого количества полей рассмотрите использование кастомных плагинов или расширений WooCommerce.
  • Если требуется массовая работа с дополнительными полями, для удобства можно использовать плагин Clearfy Pro от WPShop (https://wpshop.ru/plugins/clearfy?utm_source=wpone.ru&utm_medium=article&utm_campaign=woocommerce-ustanovka-i-nastrojka-dopolnitelnogo-pole-v-forme-oformleniya) для оптимизации и управления метаданными.

Сравнение способов добавления дополнительного поля в WooCommerce

МетодПлюсыМинусыРекомендации
Добавление кода в functions.phpПолный контроль, нет лишних плагиновТребует навыков, возможны ошибкиДля опытных разработчиков и небольших изменений
Использование плагинов (Checkout Field Editor и аналоги)Простой интерфейс, быстроДополнительная нагрузка, ограниченная кастомизацияДля быстрого внедрения без кода
Создание собственного плагинаУправляемость, масштабируемостьТребует разработки и поддержкиДля крупных проектов и повторного использования
Как вывести оценки пользователей в WordPress с помощью плагинов и кода
25.02.2026
Как вывести многоязычный контент в WordPress с помощью WPML
30.03.2026
Как избежать конфликтов между плагинами в WordPress
13.02.2026
Как создать собственный тип записи в WordPress с примерами кода
21.12.2025
WooCommerce: автоматическое изменение стоимости товара после оплаты с помощью хука
31.05.2026