Сценарий знакомый: клиент оформляет заказ, но важная информация теряется — номер подъезда, пожелание по доставке, имя получателя, комментарий к печати, размер упаковки. Поле order comments в WooCommerce есть по умолчанию, но оно не всегда обязательно, а в некоторых темах и сборках checkout его вообще убирают или прячут.
Ниже — рабочий способ сделать комментарий обязательным именно на этапе оформления заказа, без правки шаблонов плагина. Подход подходит для классического checkout WooCommerce. Если у вас Checkout Block, логика будет другой, и это важно проверить заранее.
Когда проблема проявляется и как её быстро диагностировать
Сначала убедитесь, что речь именно о checkout WooCommerce, а не о кастомной форме заказа из темы или стороннего плагина. Иначе вы будете править не тот слой.
Признаки, что комментарий сейчас не контролируется
- Заказ создаётся без комментария, хотя менеджеру он нужен всегда.
- Поле
order_commentsотображается, но его можно отправить пустым. - Тема переопределяет шаблон checkout и скрывает стандартный блок заметок.
- После обновления WooCommerce поле стало вести себя иначе, чем раньше.
Проверка простая: откройте страницу оформления заказа, оставьте комментарий пустым и попробуйте отправить заказ. Если заказ проходит, значит валидации нет на сервере. Проверять только фронтенд-обязательность через required в HTML нельзя — её легко обойти.
Что лучше: код, плагин или правка шаблона
Для такой задачи обычно есть три пути. Шаблон править не советую: обновление темы или WooCommerce быстро всё сломает. Плагин подходит, если нужен безкодовый сценарий, но для одного обязательного поля это часто избыточно.
| Подход | Плюсы | Минусы |
|---|---|---|
| Код через хук WooCommerce | Точно контролирует валидацию, не зависит от темы | Нужно добавить фрагмент в child theme или мини-плагин |
| Плагин для checkout fields | Быстро настраивается из админки | Лишняя зависимость, возможны конфликты с другими расширениями checkout |
| Правка шаблона checkout | Можно полностью изменить интерфейс | Сложнее поддерживать, выше риск поломки при обновлениях |
Если задача ровно одна — сделать комментарий обязательным, лучше использовать хук woocommerce_checkout_process и, при необходимости, добавить метку обязательности в форму.
Пошаговое решение через код
Ниже два фрагмента: первый добавляет понятную пометку у поля комментария, второй валидирует его на сервере. Это важнее, чем просто поставить required в HTML.
1. Сделать поле визуально обязательным
add_filter( 'woocommerce_checkout_fields', function( $fields ) {
if ( isset( $fields['order']['order_comments'] ) ) {
$fields['order']['order_comments']['required'] = true;
$fields['order']['order_comments']['label'] = 'Комментарий к заказу *';
}
return $fields;
} );Этот фрагмент не гарантирует защиту от пустой отправки, но помогает пользователю понять, что поле обязательно. В зависимости от темы WooCommerce может рендерить поле как textarea в блоке дополнительных сведений.
2. Проверить комментарий на сервере
add_action( 'woocommerce_checkout_process', function() {
$comment = isset( $_POST['order_comments'] ) ? trim( wp_unslash( $_POST['order_comments'] ) ) : '';
if ( '' === $comment ) {
wc_add_notice( 'Пожалуйста, укажите комментарий к заказу.', 'error' );
}
} );Здесь проверка идёт уже на сервере. Даже если пользователь отключил JavaScript или отправил форму вручную, заказ не пройдёт без комментария.
3. Сохранить комментарий в заказе без сюрпризов
Обычно WooCommerce сам сохраняет заметки клиента в заказ, если поле присутствует в форме. Но если тема или плагин меняют структуру checkout, полезно убедиться, что данные не теряются. Для этого можно использовать стандартный хук сохранения мета заказа.
add_action( 'woocommerce_checkout_create_order', function( $order, $data ) {
if ( ! empty( $_POST['order_comments'] ) ) {
$order->set_customer_note( sanitize_textarea_field( wp_unslash( $_POST['order_comments'] ) ) );
}
}, 10, 2 );Этот вариант не дублирует логику WooCommerce, а подстраховывает случаи, когда тема вмешивается в форму. Если вы уже видите комментарий в админке заказа, этот блок можно не добавлять.
Если комментарий нужен не всегда, а только для отдельных товаров
Частый реальный сценарий: обязательный комментарий нужен только для персонализированных товаров, доставки в определённый регион или заказов с самовывозом. Тогда не стоит делать поле обязательным для всех заказов подряд.
В таком случае лучше проверять содержимое корзины или выбранный способ доставки и включать валидацию только при нужных условиях. Например, если в корзине есть товар с меткой custom или если выбран конкретный shipping method.
add_action( 'woocommerce_checkout_process', function() {
$needs_comment = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
if ( $product && $product->get_meta( '_requires_comment' ) ) {
$needs_comment = true;
break;
}
}
if ( $needs_comment ) {
$comment = isset( $_POST['order_comments'] ) ? trim( wp_unslash( $_POST['order_comments'] ) ) : '';
if ( '' === $comment ) {
wc_add_notice( 'Для этого товара нужен комментарий к заказу.', 'error' );
}
}
} );Такой подход удобен для магазинов с кастомизацией, печатью, сборкой под заказ и услугами, где комментарий нужен не всем покупателям.
Как проверить, что решение сработало
После внедрения не ограничивайтесь одной тестовой отправкой. Проверьте поведение в нескольких сценариях:
- пустой комментарий — заказ не должен отправляться;
- комментарий заполнен — заказ проходит;
- ошибка валидации отображается на checkout, а не только в логах;
- комментарий сохраняется в карточке заказа в админке;
- письмо о заказе, если оно используется, содержит заметку клиента;
- поведение одинаковое для гостя и для авторизованного пользователя.
Если у вас включён кэш страницы оформления заказа, очистите его и повторите тест. Checkout не должен отдаваться из кэша, иначе вы будете видеть устаревшую форму и неверные сообщения об ошибках.
Частые ошибки и как их исправить
Поле пометили required только в HTML
Это самая частая ошибка. Браузерную проверку можно обойти, а некоторые темы вообще не выводят атрибут required корректно. Исправление одно: обязательно добавляйте серверную валидацию через woocommerce_checkout_process.
Проверяют не то имя поля
В кастомных формах поле может называться не order_comments, а иначе. Перед копированием кода посмотрите HTML формы и убедитесь, что имя совпадает. Если поле переименовано, нужно менять и чтение $_POST.
Ставят код в functions.php родительской темы
После обновления темы фрагмент исчезнет. Лучше использовать дочернюю тему или небольшой mu-plugin, если логика должна жить независимо от дизайна.
Не проверяют Checkout Block
Если на сайте используется новый блочный checkout, классические хуки могут не дать ожидаемого результата. Сначала проверьте, какой именно checkout включён, и только потом внедряйте код.
Конфликтуют несколько плагинов checkout
Плагины для полей оформления заказа часто перезаписывают друг друга. Если обязательность поля не срабатывает, временно отключите расширения checkout и проверьте базовый сценарий на чистом WooCommerce.
Безопасность и производительность
Здесь всё просто: не доверяйте данным из $_POST без очистки. Для комментария используйте wp_unslash() и sanitize_textarea_field() или хотя бы trim() для проверки пустого значения. Не выводите пользовательский текст в админке или письмах без экранирования.
Если логика обязательности зависит от корзины, не делайте тяжёлые запросы к базе на каждом сабмите checkout. Проверяйте уже доступные данные корзины и метаданные товара. Это быстрее и надёжнее.
Если вам нужно не просто обязательное поле, а более сложная логика checkout — например, разные поля для разных способов доставки, — лучше выносить это в отдельный мини-плагин. Так проще тестировать и отключать при конфликте.