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)Удобно, визуальный интерфейсДополнительная нагрузка, ограниченная кастомизацияУправление полями через админку
Собственный плагинОрганизованность, переносимостьТребует времени на разработкуФункциональный модуль для проекта
WPBest руководство по решению проблемы недоработки AJAX в WordPress
09.12.2025
Как массово удалить загруженные медиа в WordPress по датам и типам файлов
08.02.2026
Как использовать кастомные статусы заказов в WooCommerce
04.05.2026
WooCommerce: как настроить отправку писем при ошибках регистрации пользователя
05.08.2026
WooCommerce: как добавить собственные поля в форму оформления заказа
16.06.2026