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

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

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

Диагностика

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

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

Без этого кода пользовательские поля, добавленные в форму оформления заказа, не сохранятся в метаданных заказа.

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

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

add_action('woocommerce_after_order_notes', 'add_bonus_card_field');
function add_bonus_card_field($checkout) {
    echo '<div id="bonus_card_field">';
    woocommerce_form_field('bonus_card', array(
        'type'          => 'text',
        'class'         => array('bonus-card-field form-row-wide'),
        'label'         => __('Номер бонусной карты'),
        'placeholder'   => __('Введите номер бонусной карты'),
        'required'      => false,
    ), $checkout->get_value('bonus_card'));
    echo '</div>';
}

2. Сохраняем значение при оформлении заказа

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

3. Отображаем данные в админке заказа

add_action('woocommerce_admin_order_data_after_billing_address', 'display_bonus_card_admin_order', 10, 1);
function display_bonus_card_admin_order($order){
    $bonus_card = get_post_meta($order->get_id(), '_bonus_card', true);
    if ($bonus_card) {
        echo '<p><strong>Номер бонусной карты:</strong> ' . esc_html($bonus_card) . '</p>';
    }
}

Как проверить, что решение работает

  • Перейдите на страницу оформления заказа и заполните новое поле «Номер бонусной карты».
  • Оформите заказ.
  • В админке WooCommerce откройте созданный заказ и проверьте, отображается ли введённый номер бонусной карты в блоке с адресом оплаты.

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

  • Данные не сохраняются: проверьте, что имя поля в форме совпадает с ключом $_POST в функции сохранения. Без этого значение не попадёт в метаданные.
  • Данные не отображаются в админке: убедитесь, что хук woocommerce_admin_order_data_after_billing_address используется правильно и функция выводит данные с использованием get_post_meta.
  • Проблемы с безопасностью: всегда используйте sanitize_text_field или другие функции очистки входящих данных перед сохранением.
  • Поле не отображается на странице оформления: проверьте, что хук woocommerce_after_order_notes не отключён темой или плагинами, и что код добавлен в functions.php активной темы или в кастомный плагин.

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

  • Используйте nonce-поля и проверку nonce, если добавляете сложные формы, чтобы защитить от CSRF-атак.
  • Не храните в мета-данных заказа большие объёмы данных — это влияет на производительность.
  • Используйте уникальные префиксы для ключей мета-данных, чтобы избежать конфликтов с другими плагинами.
  • Если поле обязательно к заполнению, добавьте проверку с помощью хука woocommerce_checkout_process:
add_action('woocommerce_checkout_process', 'validate_bonus_card_field');
function validate_bonus_card_field() {
    if (empty($_POST['bonus_card'])) {
        wc_add_notice(__('Пожалуйста, введите номер бонусной карты.'), 'error');
    }
}

Сравнение вариантов добавления данных к заказу

СпособПреимуществаНедостатки
Использование хука woocommerce_checkout_update_order_meta Простота, гибкость, полный контроль над сохранением данных Требуется писать код, нужно грамотно обрабатывать данные
Плагины для кастомных полей (например, Checkout Field Editor) Удобный интерфейс, без программирования Дополнительная нагрузка, ограниченная кастомизация
Использование Advanced Custom Fields (ACF) Гибкое создание полей, интеграция с заказами Сложнее настроить для checkout, требует доп. кода для сохранения
Как добавить поддержку видео в пользовательский блок Gutenberg в WordPress
13.12.2025
Как удалить неиспользуемые виджеты в WordPress
03.12.2025
Как отключить авторизацию через email в WordPress
26.03.2026
WooCommerce: как исправить автоматическое удаление товаров при изменении их статуса
23.06.2026
Оптимизация базы данных WordPress: удаление избыточных данных для ускорения сайта
25.11.2025