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

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

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

Диагностика: как понять, что нужно добавить поле в заказ

Если вы получаете запросы от клиентов или менеджеров магазина на дополнительные данные, которые нельзя указать в стандартных полях, это явный сигнал. Также если вы интегрируете WooCommerce с внешними сервисами и им нужны дополнительные параметры — нужно добавить поля в форму.

Проверка текущих полей

Откройте страницу оформления заказа и проверьте, какие поля доступны. Если нужного поля нет, значит нужно добавить.

Пошаговое решение: добавляем собственное поле в оформление заказа

Для добавления собственного поля используем хуки WooCommerce. Ниже пример добавления текстового поля "Номер паспорта":

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

Этот код добавит поле после блока с заметками к заказу.

Валидация поля

Чтобы проверить, что поле заполнено корректно, добавим валидацию:

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

Сохранение значения поля в заказе

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

add_action('woocommerce_checkout_update_order_meta', 'wpbest_save_custom_checkout_field');
function wpbest_save_custom_checkout_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', 'wpbest_display_custom_field_in_admin_order', 10, 1 );
function wpbest_display_custom_field_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, что значение отображается в заказе.

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

  • Поле не отображается на странице оформления заказа: Проверьте, добавлен ли код в functions.php вашей активной темы или в кастомный плагин и нет ли синтаксических ошибок.
  • Данные не сохраняются: Убедитесь, что в форме поле имеет правильный name (passport_number), а в обработчике вы правильно читаете $_POST['passport_number'].
  • Ошибка валидации не появляется: Проверьте, что хук woocommerce_checkout_process подключён и работает — можно добавить простой error_log для отладки.
  • Данные не отображаются в админке: Убедитесь, что используете правильный ключ мета _passport_number и что код вывода подключён.

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

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

Сравнение способов добавления поля: код vs плагины

МетодПлюсыМинусыКогда использовать
Добавление через код (хуки)Лёгкий вес, полный контроль, нет лишних зависимостейТребует навыков PHP, время на разработку и тестированиеКогда нужны точечные поля и кастомизация под проект
Плагины (например, Checkout Field Editor)Быстро, удобный интерфейс без кодаМожет замедлять сайт, ограниченные возможности кастомизацииКогда нужно добавить стандартные поля без разработки
Как использовать WooCommerce hooks для настройки магазина на WordPress
11.03.2026
Оптимизация кэширования в WordPress для ускорения сайта
02.12.2025
Как создать отслеживание пользовательских действий в WordPress с помощью AJAX и REST API
10.01.2026
Как удалить неиспользуемые типы записей в WordPress
29.12.2025
Как автоматизировать управление ролями пользователей WordPress по условию
13.04.2026