Почему нужно добавить дополнительное поле в форму оформления заказа WooCommerce
Стандартная форма оформления заказа WooCommerce покрывает базовые потребности, но часто возникает задача собрать дополнительную информацию от клиента — например, номер налогоплательщика, комментарий к заказу, дату доставки и т.д. Добавление кастомного поля позволяет расширить функциональность магазина без установки дополнительных плагинов.
Диагностика: определяем требования к дополнительному полю
Перед внесением изменений важно четко понимать:
- Какого типа данные нужны (текст, дата, выбор из списка);
- Обязательно ли поле для заполнения;
- В какой момент нужно показать поле (на этапе оформления, в личном кабинете, в админке заказа);
- Как использовать данные поля (сохранить в мета заказа, отобразить в письмах, использовать в логике обработки).
Пошаговое добавление дополнительного поля в WooCommerce
1. Добавление поля в форму оформления заказа
Добавим текстовое поле «ИНН покупателя» в раздел с адресом доставки:
add_action('woocommerce_after_order_notes', 'wpone_add_custom_checkout_field');
function wpone_add_custom_checkout_field( $checkout ) {
echo '<div id="wpone_custom_checkout_field">';
woocommerce_form_field( 'wpone_inn', array(
'type' => 'text',
'class' => array('wpone-field form-row-wide'),
'label' => __('ИНН покупателя'),
'placeholder' => __('Введите ИНН'),
'required' => true,
), $checkout->get_value( 'wpone_inn' ) );
echo '</div>';
}2. Валидация введенного значения
Обязательное поле нужно проверить перед сохранением заказа:
add_action('woocommerce_checkout_process', 'wpone_validate_custom_checkout_field');
function wpone_validate_custom_checkout_field() {
if ( ! $_POST['wpone_inn'] || ! preg_match('/^\d{10,12}$/', $_POST['wpone_inn']) ) {
wc_add_notice( __('Пожалуйста, введите корректный ИНН (10 или 12 цифр).'), 'error' );
}
}3. Сохранение значения в метаданных заказа
Данные из поля нужно сохранить в заказ для последующего использования:
add_action('woocommerce_checkout_update_order_meta', 'wpone_save_custom_checkout_field');
function wpone_save_custom_checkout_field( $order_id ) {
if ( ! empty( $_POST['wpone_inn'] ) ) {
update_post_meta( $order_id, '_wpone_inn', sanitize_text_field( $_POST['wpone_inn'] ) );
}
}4. Отображение поля в админке заказа
Чтобы менеджеры видели значение ИНН, добавим его в детали заказа в админке:
add_action('woocommerce_admin_order_data_after_billing_address', 'wpone_display_custom_field_admin_order', 10, 1);
function wpone_display_custom_field_admin_order($order){
$inn = get_post_meta( $order->get_id(), '_wpone_inn', true );
if ( $inn ) {
echo '<p><strong>ИНН покупателя:</strong> ' . esc_html( $inn ) . '</p>';
}
}5. Отображение дополнительного поля в письмах
Чтобы клиент и администратор видели ИНН в письме с подтверждением, добавим поле в тело письма:
add_action('woocommerce_email_customer_details', 'wpone_add_custom_field_to_email', 20, 3);
function wpone_add_custom_field_to_email( $order, $sent_to_admin, $plain_text ) {
$inn = get_post_meta( $order->get_id(), '_wpone_inn', true );
if ( $inn ) {
if ( $plain_text ) {
echo "\nИНН покупателя: {$inn}\n";
} else {
echo "<p><strong>ИНН покупателя:</strong> " . esc_html( $inn ) . "</p>";
}
}
}Проверка результата после внедрения
- Перейдите на страницу оформления заказа и убедитесь, что появилось новое поле с пометкой обязательного.
- Попробуйте отправить заказ с пустым или некорректным ИНН — должно появиться сообщение ошибки.
- Завершите заказ с валидным ИНН, затем откройте заказ в админке — поле должно отображаться.
- Проверьте письмо с подтверждением заказа — в конце должно отображаться значение ИНН.
Частые ошибки и способы их исправления
- Поле не показывается в форме оформления заказа: проверьте, что хук
woocommerce_after_order_notesподходит вашей теме и версии WooCommerce, попробуйте заменить наwoocommerce_checkout_fieldsили другой хук. - Валидация не срабатывает: убедитесь, что функция валидации подключена к хуку
woocommerce_checkout_processи что поле передается в$_POSTс правильным ключом. - Данные не сохраняются: проверьте, что в функции сохранения используется правильный ключ и что вызывается хук
woocommerce_checkout_update_order_meta. - Поле не отображается в письмах: убедитесь, что хук
woocommerce_email_customer_detailsиспользуется правильно и что вывод учитывает формат письма (html/plain).
Практические советы по безопасности и производительности
- Всегда очищайте и проверяйте пользовательский ввод перед сохранением (
sanitize_text_field, регулярные выражения). - Используйте минимально необходимые хуки, чтобы не влиять на производительность оформления заказа.
- Для сложных форм и большого количества полей рассмотрите использование кастомных плагинов или расширений WooCommerce.
- Если требуется массовая работа с дополнительными полями, для удобства можно использовать плагин Clearfy Pro от WPShop (https://wpshop.ru/plugins/clearfy?utm_source=wpone.ru&utm_medium=article&utm_campaign=woocommerce-ustanovka-i-nastrojka-dopolnitelnogo-pole-v-forme-oformleniya) для оптимизации и управления метаданными.
Сравнение способов добавления дополнительного поля в WooCommerce
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Добавление кода в functions.php | Полный контроль, нет лишних плагинов | Требует навыков, возможны ошибки | Для опытных разработчиков и небольших изменений |
| Использование плагинов (Checkout Field Editor и аналоги) | Простой интерфейс, быстро | Дополнительная нагрузка, ограниченная кастомизация | Для быстрого внедрения без кода |
| Создание собственного плагина | Управляемость, масштабируемость | Требует разработки и поддержки | Для крупных проектов и повторного использования |