Проблема: как добавить дополнительные данные к заказу при оформлении в 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, требует доп. кода для сохранения |