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

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

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

Диагностика проблемы: почему данные из дополнительных полей не сохраняются

Если вы уже пытались добавить поля в форму оформления, но данные не сохраняются, проверьте:

  • Добавлены ли поля в разметку формы с корректными именами (name="custom_field")
  • Обрабатывается ли POST-запрос и вызывается ли сохранение данных в мета заказа
  • Нет ли ошибок PHP или конфликтов с другими плагинами
  • Проверяйте логи сервера и консоль браузера на ошибки JavaScript, которые могут мешать отправке формы

Пошаговое решение: добавление и сохранение дополнительного поля

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

Добавьте следующий код в файл functions.php вашей темы или подключаемого плагина:

add_action('woocommerce_after_order_notes', 'add_custom_checkout_field');
function add_custom_checkout_field( $checkout ) {
    echo '<div id="custom_checkout_field">';

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

    echo '</div>';
}

2. Валидация поля при оформлении заказа

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

add_action('woocommerce_checkout_process', 'validate_custom_checkout_field');
function validate_custom_checkout_field() {
    if ( ! $_POST['passport_number'] ) {
        wc_add_notice( __('Пожалуйста, введите номер паспорта.'), 'error' );
    }
}

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

Используем хук woocommerce_checkout_update_order_meta для сохранения:

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

4. Отображаем данные на странице заказа в админке и в письмах

Чтобы видеть поле в админке и в письмах, добавим:

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

// В письме с деталями заказа
add_filter( 'woocommerce_email_order_meta_keys', 'add_custom_field_to_order_email' );
function add_custom_field_to_order_email( $keys ) {
    $keys[] = '_passport_number';
    return $keys;
}

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

Чтобы убедиться, что всё работает:

  • Оформите тестовый заказ, заполнив новое поле
  • Проверьте, что при отсутствии данных появляется ошибка
  • После оформления откройте заказ в админке WooCommerce — дополнительное поле должно отображаться
  • Проверьте письмо с подтверждением заказа, поле должно быть в деталях

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

  • Ошибка: Дополнительное поле не отображается в форме.
    Причина: Хук для добавления поля неправильно выбран или тема переопределяет шаблоны.
    Решение: Используйте woocommerce_after_order_notes или woocommerce_checkout_fields для добавления полей, убедитесь, что код подключён.
  • Ошибка: Данные не сохраняются.
    Причина: Отсутствует вызов update_post_meta или неправильный ключ.
    Решение: Проверьте, что поле передаётся через POST и используется правильный ключ мета.
  • Ошибка: Валидация не срабатывает.
    Причина: Код валидации не подключён или ошибка в условии.
    Решение: Проверьте, что хук woocommerce_checkout_process используется корректно и проверяется именно нужный ключ.

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

  • Используйте sanitize_text_field для очистки данных перед сохранением
  • Обязательно валидируйте пользовательский ввод на стороне сервера
  • Если поле не обязательное, проверяйте его наличие перед сохранением
  • Для сложных полей используйте специализированные методы валидации
  • Избегайте лишних запросов к базе: сохраняйте только необходимые данные

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

МетодПлюсыМинусы
Код в functions.php с хуком woocommerce_checkout_update_order_metaПолный контроль, без плагинов, легко кастомизироватьТребует навыков PHP, при обновлении темы можно потерять изменения
Использование плагинов (например, Checkout Field Editor)Простота, визуальный интерфейс, быстрый запускМожет нагружать сайт, ограниченная гибкость, платные функции
Переопределение шаблонов WooCommerceГибкость в дизайне и логикеСложно поддерживать обновления, требует знаний шаблонной системы
WooCommerce: как эффективно очистить базу от старых корзин и заказов
18.06.2026
Как использовать WPCommunity для создания приватного клубного сайта на WordPress
19.01.2026
Как создать собственный виджет в WordPress: пошаговое руководство
17.11.2025
Как создать собственный блок для Gutenberg в WordPress
16.01.2026
Как использовать AJAX в формах WordPress без плагинов
29.01.2026