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

Зачем добавлять дополнительные поля в WooCommerce

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

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

Прежде чем внедрять изменения, убедитесь, что стандартных полей WooCommerce недостаточно. Задайте себе вопросы:

  • Есть ли данные, которые критично важно получить при регистрации или заказе?
  • Можно ли обойтись без дополнительных плагинов?
  • Как должна выглядеть валидация новых полей?

Если ответ «да» на первый вопрос, значит, нужно добавлять поля программно.

Как добавить дополнительное поле в форму регистрации WooCommerce

Чтобы добавить поле, воспользуемся хуком woocommerce_register_form. Для валидации — woocommerce_register_post, а для сохранения — user_register.

<?php
// Добавляем поле в форму регистрации
add_action('woocommerce_register_form', 'add_custom_registration_field');
function add_custom_registration_field() {
    ?>
    <p class="form-row form-row-wide">
        <label for="birthday">Дата рождения <span class="required">*</span></label>
        <input type="date" class="input-text" name="birthday" id="birthday" value="<?php if (!empty($_POST['birthday'])) echo esc_attr($_POST['birthday']); ?>" />
    </p>
    <?php
}

// Валидируем поле
add_action('woocommerce_register_post', 'validate_custom_registration_field', 10, 3);
function validate_custom_registration_field($username, $email, $validation_errors) {
    if (empty($_POST['birthday'])) {
        $validation_errors->add('birthday_error', 'Пожалуйста, укажите дату рождения.');
    }
}

// Сохраняем поле
add_action('user_register', 'save_custom_registration_field');
function save_custom_registration_field($user_id) {
    if (!empty($_POST['birthday'])) {
        update_user_meta($user_id, 'birthday', sanitize_text_field($_POST['birthday']));
    }
}
?>

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

Добавление поля на страницу оформления заказа

Используем хук woocommerce_after_order_notes для вывода поля и woocommerce_checkout_process для валидации.

<?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('delivery_instructions', array(
        'type' => 'textarea',
        'class' => array('form-row-wide'),
        'label' => 'Инструкции для доставки',
        'placeholder' => 'Укажите пожелания по доставке',
        'required' => false,
    ), $checkout->get_value('delivery_instructions'));
    echo '</div>';
}

// Валидация
add_action('woocommerce_checkout_process', 'validate_custom_checkout_field');
function validate_custom_checkout_field() {
    if (isset($_POST['delivery_instructions']) && strlen($_POST['delivery_instructions']) > 500) {
        wc_add_notice('Инструкции для доставки не должны превышать 500 символов.', 'error');
    }
}

// Сохраняем данные в метаданные заказа
add_action('woocommerce_checkout_update_order_meta', 'save_custom_checkout_field');
function save_custom_checkout_field($order_id) {
    if (!empty($_POST['delivery_instructions'])) {
        update_post_meta($order_id, 'delivery_instructions', sanitize_textarea_field($_POST['delivery_instructions']));
    }
}
?>

Вывод дополнительных полей в админке WooCommerce

Чтобы видеть данные в карточке заказа, используем хук woocommerce_admin_order_data_after_billing_address.

<?php
add_action('woocommerce_admin_order_data_after_billing_address', 'display_custom_checkout_field_admin_order', 10, 1);
function display_custom_checkout_field_admin_order($order){
    $delivery_instructions = get_post_meta($order->get_id(), 'delivery_instructions', true);
    if ($delivery_instructions) {
        echo '<p><strong>Инструкции для доставки:</strong> ' . esc_html($delivery_instructions) . '</p>';
    }
}
?>

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

  • Зарегистрируйтесь как новый пользователь, заполнив поле «Дата рождения» — проверьте, что ошибка появляется при пустом поле и что данные сохраняются в базе (meta_key = birthday).
  • Оформите заказ, заполнив поле «Инструкции для доставки», проверьте, что данные сохраняются и отображаются в админке заказа.
  • Проверьте в базе данных таблицы wp_usermeta и wp_postmeta на наличие новых ключей и значений.

Частые ошибки при добавлении кастомных полей в WooCommerce

  • Поле не отображается в форме. Убедитесь, что функция добавления поля привязана к правильному хуку и что код подключен в functions.php или плагине.
  • Данные не сохраняются. Часто забывают реализовать сохранение через хуки user_register или woocommerce_checkout_update_order_meta.
  • Валидация не работает. Проверьте, что хук валидации вызывается и что ошибки добавляются через wc_add_notice или $validation_errors->add().
  • Данные не отображаются в админке. Нужно использовать правильный хук для вывода метаданных заказа — woocommerce_admin_order_data_after_billing_address.

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

  • Используйте функции очистки данных: sanitize_text_field, sanitize_textarea_field, esc_html для вывода.
  • Не храните чувствительные данные в открытом виде — применяйте шифрование при необходимости.
  • Для производительности не создавайте слишком много дополнительных полей, чтобы не перегружать базу.
  • Тестируйте изменения на тестовом сайте перед внедрением в продакшен.

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

СпособПлюсыМинусыПример
Добавление через код в functions.phpПолный контроль, оптимизация, минимум плагиновТребует знаний PHP, больше времениПримеры из статьи
Использование плагинов (например, Checkout Field Editor)Быстро, без кода, удобный интерфейсНагрузка на сайт, ограниченная кастомизацияClearfy (оптимизация и управление полями)
Как использовать WPChecker для анализа и оптимизации работы с плагинами WordPress
10.04.2026
Как отладить проблемы с AJAX в WordPress
01.12.2025
Как использовать meta запросы в WordPress для эффективного поиска и фильтрации
27.02.2026
WooCommerce: как использовать хук woocommerce_order_status_changed для автоматического изменения статуса заказа
19.06.2026
WooCommerce: не отправляется письмо подтверждения заказа — как исправить
01.05.2026