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

Почему нужно добавлять дополнительные поля в форму оформления WooCommerce

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

Диагностика проблемы: как понять, что стандартного функционала недостаточно

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

Признаки:

  • Отсутствие нужного поля в форме оформления заказа;
  • Добавленное поле не сохраняет данные при оформлении;
  • Данные не отображаются в админке заказов;
  • Данные не передаются в письмах с заказом.

Пошаговое решение: добавляем кастомное поле в WooCommerce

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

add_action('woocommerce_after_order_notes', 'wplock_add_custom_checkout_field');
function wplock_add_custom_checkout_field( $checkout ) {
    echo '<div id="wplock_custom_checkout_field">';
    woocommerce_form_field( 'passport_number', array(
        'type'          => 'text',
        'class'         => array('wplock-passport-field form-row-wide'),
        'label'         => __('Номер паспорта'),
        'placeholder'   => __('Введите номер паспорта'),
        'required'      => true,
    ), $checkout->get_value( 'passport_number' ));
    echo '</div>';
}

2. Проверяем введённые данные

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

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

add_action('woocommerce_checkout_update_order_meta', 'wplock_custom_checkout_field_update_order_meta');
function wplock_custom_checkout_field_update_order_meta( $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', 'wplock_custom_checkout_field_display_admin_order_meta', 10, 1);
function wplock_custom_checkout_field_display_admin_order_meta($order){
    $passport = get_post_meta( $order->get_id(), 'passport_number', true );
    if ( $passport ) {
        echo '<p><strong>Номер паспорта:</strong> ' . esc_html( $passport ) . '</p>';
    }
}

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

add_filter('woocommerce_email_order_meta_fields', 'wplock_custom_checkout_field_email_order_meta_fields', 10, 3);
function wplock_custom_checkout_field_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
    $fields['passport_number'] = array(
        'label' => __('Номер паспорта'),
        'value' => get_post_meta( $order->get_id(), 'passport_number', true ),
    );
    return $fields;
}

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

  • Откройте страницу оформления заказа и убедитесь, что поле "Номер паспорта" отображается.
  • Попробуйте оформить заказ без заполнения поля — должна появиться ошибка.
  • Заполните поле, оформите заказ.
  • Перейдите в админку WooCommerce - Заказы, откройте созданный заказ, проверьте наличие введённого номера паспорта в разделе с адресом оплаты.
  • Проверьте письмо с заказом (письмо клиенту или админу) — поле должно отображаться в метаданных.

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

  • Поле не отображается в форме: Проверьте, что функция добавления поля подключена через правильный хук woocommerce_after_order_notes или другой подходящий. Убедитесь, что код добавлен в functions.php вашей темы или в свой плагин.
  • Данные не сохраняются: Проверьте, что в обработчике сохранения используется именно update_post_meta с правильным ID заказа.
  • Ошибка валидации не срабатывает: Убедитесь, что используется хук woocommerce_checkout_process и добавлен вызов wc_add_notice с типом "error".
  • Данные не отображаются в письме: Фильтр woocommerce_email_order_meta_fields должен возвращать массив с корректными ключами 'label' и 'value'.

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

  • Всегда используйте функцию sanitize_text_field() или аналогичные для очистки данных перед сохранением в базу.
  • Добавляйте только необходимые поля, чтобы не перегружать форму и базу.
  • Проверяйте совместимость вашего кода с используемой версией WooCommerce и PHP.
  • Для большого количества кастомных полей рассмотрите создание отдельного плагина, чтобы не засорять functions.php.
  • При необходимости кеширования убедитесь, что метаданные заказа обновляются корректно.

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

МетодПлюсыМинусыРекомендуемая ситуация
Ручное добавление через хуки и код Полный контроль, отсутствие лишних плагинов Требует навыков PHP и понимания WooCommerce Для точечных полей и кастомизаций
Использование плагинов (Checkout Field Editor и др.) Простота, визуальный интерфейс Может влиять на производительность, ограничена гибкость Если нужно много полей без программирования
Как изменить URL страницы авторского архива в WordPress
23.03.2026
Как удалить пустые теги в WordPress с помощью кода
19.03.2026
Решение проблем с хранением сессий в WooCommerce при большой нагрузке
03.07.2026
Как использовать Transients в WooCommerce для оптимизации кеширования
14.07.2026
Как изменить вывод сообщений об ошибках в WordPress
21.02.2026