Зачем нужны дополнительные поля в заказах WooCommerce
По умолчанию WooCommerce предлагает стандартный набор полей для оформления заказа. Но часто требуется собрать дополнительную информацию от покупателя: номер телефона для доставки, комментарии, данные для подарочной упаковки и т.п. В этой статье разберём, как добавить и правильно обработать дополнительные поля в форме оформления заказа, сохранить их в метаданных заказа и вывести в админке.
Диагностика проблемы: почему стандартных полей недостаточно
Если вам нужно добавить поле, например, "Дата доставки" или "Номер получателя", а стандартными средствами это сделать нельзя, то без кастомизации оформление заказа будет неполным, а нужная информация не сохранится и не отобразится в заказе.
Типичные признаки проблемы:
- Отсутствие нужного поля в форме оформления заказа.
- Невозможность сохранить или получить дополнительную информацию в админке WooCommerce.
Пошаговое решение: добавляем и обрабатываем дополнительные поля
1. Добавление поля в форму оформления заказа
Используем хук woocommerce_after_order_notes для вывода дополнительного поля, например, текстового поля "Номер получателя":
add_action('woocommerce_after_order_notes', 'wpchecker_add_custom_checkout_field');
function wpchecker_add_custom_checkout_field($checkout) {
echo '<div id="custom_checkout_field">';
woocommerce_form_field('recipient_phone', array(
'type' => 'text',
'class' => array('form-row-wide'),
'label' => __('Номер получателя'),
'placeholder' => __('Введите номер получателя'),
'required' => true,
), $checkout->get_value('recipient_phone'));
echo '</div>';
}2. Проверка заполнения поля при отправке заказа
Добавим валидацию для обязательного поля с помощью хука woocommerce_checkout_process:
add_action('woocommerce_checkout_process', 'wpchecker_validate_custom_checkout_field');
function wpchecker_validate_custom_checkout_field() {
if (empty($_POST['recipient_phone'])) {
wc_add_notice(__('Пожалуйста, введите номер получателя.'), 'error');
}
}3. Сохранение данных в метаданных заказа
Чтобы данные сохранялись, используем хук woocommerce_checkout_update_order_meta:
add_action('woocommerce_checkout_update_order_meta', 'wpchecker_save_custom_checkout_field');
function wpchecker_save_custom_checkout_field($order_id) {
if (!empty($_POST['recipient_phone'])) {
update_post_meta($order_id, '_recipient_phone', sanitize_text_field($_POST['recipient_phone']));
}
}4. Отображение дополнительного поля в админке заказа
Для удобства менеджера выведем поле на странице редактирования заказа в админке:
add_action('woocommerce_admin_order_data_after_billing_address', 'wpchecker_display_custom_field_admin_order', 10, 1);
function wpchecker_display_custom_field_admin_order($order){
$recipient_phone = get_post_meta($order->get_id(), '_recipient_phone', true);
if ($recipient_phone) {
echo '<p><strong>Номер получателя:</strong> ' . esc_html($recipient_phone) . '</p>';
}
}Проверка результата после внедрения
- Перейдите на страницу оформления заказа и убедитесь, что поле "Номер получателя" отображается и является обязательным.
- Попробуйте оформить заказ без заполнения поля — должна появиться ошибка.
- Оформите заказ с заполненным полем.
- В админке откройте заказ и проверьте, что значение поля отображается корректно.
Частые ошибки и как их исправить
- Поле не отображается в форме — проверьте правильность использования хука, не конфликтует ли тема или другой плагин с выводом.
- Ошибка валидации не появляется — убедитесь, что хук
woocommerce_checkout_processподключён и функция корректно проверяет$_POST. - Данные не сохраняются — проверьте, что функция сохраняет данные с помощью
update_post_metaи полеnameв форме совпадает с ключом в$_POST. - Данные не видны в админке — убедитесь, что используете корректный хук
woocommerce_admin_order_data_after_billing_addressи правильно получаете метаданные заказа.
Практические советы по безопасности и производительности
- Обязательно фильтруйте пользовательский ввод через
sanitize_text_fieldили другие функции в зависимости от типа данных. - Не сохраняйте избыточные или чувствительные данные в метаданных заказа без необходимости.
- Если планируется много дополнительных полей, рассмотрите создание отдельной таблицы или использование кастомных постов для хранения данных, чтобы не перегружать метаданные.
- Тестируйте совместимость с другими плагинами, которые могут менять процесс оформления заказа.
Сравнение способов добавления дополнительных полей
| Способ | Плюсы | Минусы |
|---|---|---|
| Код в functions.php или кастомном плагине | Полный контроль, минимум плагинов, гибкость | Требует навыков разработки, возможны ошибки |
| Плагины (например, Checkout Field Editor) | Удобство, визуальная настройка без кода | Зависимость от стороннего кода, нагрузка, ограничения |