Почему нужно добавлять дополнительные поля в форму оформления WooCommerce
Стандартная форма оформления заказа WooCommerce покрывает большинство базовых потребностей, но часто требуется собрать дополнительную информацию от покупателя — например, номер паспорта, ИНН, дату доставки, комментарии для курьера и т.п. В таких случаях добавление кастомного поля решает задачу без использования громоздких плагинов.
Диагностика проблемы: как понять, что стандартного функционала недостаточно
Если вы не можете в админке WooCommerce или через настройки темы добавить нужное поле, либо поле есть, но данные не сохраняются или не отображаются в заказах, значит необходимо вмешательство через хуки и фильтры.
Признаки:
- Отсутствие нужного поля в форме оформления заказа;
- Добавленное поле не сохраняет данные при оформлении;
- Данные не отображаются в админке заказов;
- Данные не передаются в письмах с заказом.
Пошаговое решение: добавляем кастомное поле в WooCommerce
1. Добавляем поле в форму оформления
add_action('woocommerce_after_order_notes', 'wplock_add_custom_checkout_field');
function wplock_add_custom_checkout_field( $checkout ) {
echo '<div id="wplock_custom_checkout_field">';
woocommerce_form_field( 'passport_number', array(
'type' => 'text',
'class' => array('wplock-passport-field form-row-wide'),
'label' => __('Номер паспорта'),
'placeholder' => __('Введите номер паспорта'),
'required' => true,
), $checkout->get_value( 'passport_number' ));
echo '</div>';
}2. Проверяем введённые данные
add_action('woocommerce_checkout_process', 'wplock_custom_checkout_field_process');
function wplock_custom_checkout_field_process() {
if ( ! $_POST['passport_number'] || empty(trim($_POST['passport_number'])) ) {
wc_add_notice( __( 'Пожалуйста, введите номер паспорта.' ), 'error' );
}
}3. Сохраняем данные в мета заказа
add_action('woocommerce_checkout_update_order_meta', 'wplock_custom_checkout_field_update_order_meta');
function wplock_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['passport_number'] ) ) {
update_post_meta( $order_id, 'passport_number', sanitize_text_field( $_POST['passport_number'] ) );
}
}4. Отображаем данные в админке заказа
add_action('woocommerce_admin_order_data_after_billing_address', 'wplock_custom_checkout_field_display_admin_order_meta', 10, 1);
function wplock_custom_checkout_field_display_admin_order_meta($order){
$passport = get_post_meta( $order->get_id(), 'passport_number', true );
if ( $passport ) {
echo '<p><strong>Номер паспорта:</strong> ' . esc_html( $passport ) . '</p>';
}
}5. Добавляем данные в письмо с заказом
add_filter('woocommerce_email_order_meta_fields', 'wplock_custom_checkout_field_email_order_meta_fields', 10, 3);
function wplock_custom_checkout_field_email_order_meta_fields( $fields, $sent_to_admin, $order ) {
$fields['passport_number'] = array(
'label' => __('Номер паспорта'),
'value' => get_post_meta( $order->get_id(), 'passport_number', true ),
);
return $fields;
}Проверка результата после внедрения
- Откройте страницу оформления заказа и убедитесь, что поле "Номер паспорта" отображается.
- Попробуйте оформить заказ без заполнения поля — должна появиться ошибка.
- Заполните поле, оформите заказ.
- Перейдите в админку WooCommerce - Заказы, откройте созданный заказ, проверьте наличие введённого номера паспорта в разделе с адресом оплаты.
- Проверьте письмо с заказом (письмо клиенту или админу) — поле должно отображаться в метаданных.
Частые ошибки и как их исправить
- Поле не отображается в форме: Проверьте, что функция добавления поля подключена через правильный хук
woocommerce_after_order_notesили другой подходящий. Убедитесь, что код добавлен в functions.php вашей темы или в свой плагин. - Данные не сохраняются: Проверьте, что в обработчике сохранения используется именно
update_post_metaс правильным ID заказа. - Ошибка валидации не срабатывает: Убедитесь, что используется хук
woocommerce_checkout_processи добавлен вызовwc_add_noticeс типом "error". - Данные не отображаются в письме: Фильтр
woocommerce_email_order_meta_fieldsдолжен возвращать массив с корректными ключами 'label' и 'value'.
Практические советы по безопасности и производительности
- Всегда используйте функцию
sanitize_text_field()или аналогичные для очистки данных перед сохранением в базу. - Добавляйте только необходимые поля, чтобы не перегружать форму и базу.
- Проверяйте совместимость вашего кода с используемой версией WooCommerce и PHP.
- Для большого количества кастомных полей рассмотрите создание отдельного плагина, чтобы не засорять functions.php.
- При необходимости кеширования убедитесь, что метаданные заказа обновляются корректно.
Сравнение методов добавления дополнительных полей в WooCommerce
| Метод | Плюсы | Минусы | Рекомендуемая ситуация |
|---|---|---|---|
| Ручное добавление через хуки и код | Полный контроль, отсутствие лишних плагинов | Требует навыков PHP и понимания WooCommerce | Для точечных полей и кастомизаций |
| Использование плагинов (Checkout Field Editor и др.) | Простота, визуальный интерфейс | Может влиять на производительность, ограничена гибкость | Если нужно много полей без программирования |