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)Быстро, удобный интерфейс без кодаМожет замедлять сайт, ограниченные возможности кастомизацииКогда нужно добавить стандартные поля без разработки
Как использовать шорткоды для динамического контента в WordPress
15.02.2026
Как настроить очистку базы данных WordPress от старых данных
19.11.2025
Как использовать WP-Cron для автоматизации задач в WordPress
27.05.2026
Как массово удалить загруженные медиа в WordPress по датам и типам файлов
08.02.2026
WooCommerce: как исправить проблему с обновлением цены при изменении атрибутов товара
21.05.2026