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