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