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

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

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

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

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

Используем хук woocommerce_after_order_notes для вывода дополнительного поля на странице оформления заказа. Пример кода в functions.php вашей темы или в кастомном плагине:

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( 'wpbest_custom_field', array(
        'type'          => 'text',
        'class'         => array('wpbest-custom-field form-row-wide'),
        'label'         => __('Дополнительная информация'),
        'placeholder'   => __('Введите дополнительную информацию'),
        'required'      => false,
    ), $checkout->get_value( 'wpbest_custom_field' ));
    echo '</div>';
}

2. Валидация поля при отправке формы

Если нужно сделать поле обязательным, добавим проверку через хук woocommerce_checkout_process:

add_action('woocommerce_checkout_process', 'wpbest_validate_custom_checkout_field');
function wpbest_validate_custom_checkout_field() {
    if ( ! $_POST['wpbest_custom_field'] ) {
        wc_add_notice( __('Пожалуйста, заполните дополнительную информацию.'), 'error' );
    }
}

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

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

add_action('woocommerce_checkout_update_order_meta', 'wpbest_save_custom_checkout_field');
function wpbest_save_custom_checkout_field( $order_id ) {
    if ( ! empty( $_POST['wpbest_custom_field'] ) ) {
        update_post_meta( $order_id, '_wpbest_custom_field', sanitize_text_field( $_POST['wpbest_custom_field'] ) );
    }
}

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

Чтобы администратор мог видеть введённые данные, добавим вывод через хук woocommerce_admin_order_data_after_billing_address:

add_action('woocommerce_admin_order_data_after_billing_address', 'wpbest_display_custom_field_admin_order', 10, 1);
function wpbest_display_custom_field_admin_order($order){
    $custom_field = get_post_meta( $order->get_id(), '_wpbest_custom_field', true );
    if ( $custom_field ) {
        echo '<p><strong>' . __('Дополнительная информация') . ':</strong> ' . esc_html( $custom_field ) . '</p>';
    }
}

5. Добавление поля в письмо с заказом

Для включения информации в письмо используйте фильтр woocommerce_email_order_meta_fields:

add_filter('woocommerce_email_order_meta_fields', 'wpbest_add_custom_field_to_email', 10, 3);
function wpbest_add_custom_field_to_email( $fields, $sent_to_admin, $order ) {
    $custom_field = get_post_meta( $order->get_id(), '_wpbest_custom_field', true );
    if ( $custom_field ) {
        $fields['wpbest_custom_field'] = array(
            'label' => __('Дополнительная информация'),
            'value' => $custom_field,
        );
    }
    return $fields;
}

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

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

  • Перейдите на страницу оформления заказа и убедитесь, что новое поле отображается.
  • Попробуйте оформить заказ, заполняя поле (и без заполнения, если оно необязательно).
  • В админке в разделе заказов откройте свежий заказ и проверьте наличие введённого значения.
  • Проверьте письмо с подтверждением заказа (если настроены письма), чтобы убедиться, что поле отображается корректно.

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

  • Поле не сохраняется в заказе. Проверьте, что имя поля в форме совпадает с ключом в $_POST и что функция сохранения вызывается на правильном хуке.
  • Поле не отображается в админке. Убедитесь, что используете правильный хук woocommerce_admin_order_data_after_billing_address, и что ключ метаданных совпадает с сохранённым.
  • Ошибка валидации, хотя поле необязательно. Проверьте функцию валидации, возможно, там жёстко стоит требование заполнения.
  • Данные не отображаются в письме. Используйте именно фильтр woocommerce_email_order_meta_fields, а не хуки для изменения тела письма напрямую.

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

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

Таблица сравнения вариантов реализации собственных полей в WooCommerce

СпособПлюсыМинусыПример использования
Код в functions.phpБыстро, без плагинов, полный контрольРиск потери при смене темы, требует навыковДобавление поля с хуками WooCommerce
Плагин (например, Checkout Field Editor)Удобно, визуальный интерфейсДополнительная нагрузка, ограниченная кастомизацияУправление полями через админку
Собственный плагинОрганизованность, переносимостьТребует времени на разработкуФункциональный модуль для проекта
Как создать отслеживание событий в WordPress с помощью REST API
17.12.2025
WooCommerce: как добавить собственные поля в форму оформления заказа
16.06.2026
WooCommerce: реальные сценарии изменения цены при выборе атрибутов товаров
14.07.2026
WooCommerce: как исправить проблему с обновлением цены при изменении атрибутов товара
21.05.2026
WooCommerce: правильная настройка отправки писем и решение типичных проблем
27.07.2026