Диагностика задачи: зачем нужны собственные поля в оформлении заказа WooCommerce
Иногда стандартных полей в форме оформления заказа WooCommerce недостаточно для сбора необходимой информации от клиента. Например, нужно добавить поле с дополнительной инструкцией, кодом скидки, номером договора или выбрать способ упаковки. Важно, чтобы эти поля корректно сохранялись, отображались в админке и передавались в письмах и заказах.
Пошаговое решение: создание и обновление собственных полей в форме оформления заказа
1. Добавление поля в форму оформления заказа
Используем хук woocommerce_after_order_notes для вывода дополнительного поля на странице оформления заказа. Пример кода в functions.php вашей темы или в кастомном плагине:
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( 'wpbest_custom_field', array(
'type' => 'text',
'class' => array('wpbest-custom-field form-row-wide'),
'label' => __('Дополнительная информация'),
'placeholder' => __('Введите дополнительную информацию'),
'required' => false,
), $checkout->get_value( 'wpbest_custom_field' ));
echo '</div>';
}2. Валидация поля при отправке формы
Если нужно сделать поле обязательным, добавим проверку через хук woocommerce_checkout_process:
add_action('woocommerce_checkout_process', 'wpbest_validate_custom_checkout_field');
function wpbest_validate_custom_checkout_field() {
if ( ! $_POST['wpbest_custom_field'] ) {
wc_add_notice( __('Пожалуйста, заполните дополнительную информацию.'), 'error' );
}
}3. Сохранение значения поля в метаданных заказа
Используем хук woocommerce_checkout_update_order_meta для сохранения данных при оформлении заказа:
add_action('woocommerce_checkout_update_order_meta', 'wpbest_save_custom_checkout_field');
function wpbest_save_custom_checkout_field( $order_id ) {
if ( ! empty( $_POST['wpbest_custom_field'] ) ) {
update_post_meta( $order_id, '_wpbest_custom_field', sanitize_text_field( $_POST['wpbest_custom_field'] ) );
}
}4. Отображение поля в админке заказа
Чтобы администратор мог видеть введённые данные, добавим вывод через хук woocommerce_admin_order_data_after_billing_address:
add_action('woocommerce_admin_order_data_after_billing_address', 'wpbest_display_custom_field_admin_order', 10, 1);
function wpbest_display_custom_field_admin_order($order){
$custom_field = get_post_meta( $order->get_id(), '_wpbest_custom_field', true );
if ( $custom_field ) {
echo '<p><strong>' . __('Дополнительная информация') . ':</strong> ' . esc_html( $custom_field ) . '</p>';
}
}5. Добавление поля в письмо с заказом
Для включения информации в письмо используйте фильтр woocommerce_email_order_meta_fields:
add_filter('woocommerce_email_order_meta_fields', 'wpbest_add_custom_field_to_email', 10, 3);
function wpbest_add_custom_field_to_email( $fields, $sent_to_admin, $order ) {
$custom_field = get_post_meta( $order->get_id(), '_wpbest_custom_field', true );
if ( $custom_field ) {
$fields['wpbest_custom_field'] = array(
'label' => __('Дополнительная информация'),
'value' => $custom_field,
);
}
return $fields;
}Проверка результата после внедрения
Чтобы убедиться, что всё работает:
- Перейдите на страницу оформления заказа и убедитесь, что новое поле отображается.
- Попробуйте оформить заказ, заполняя поле (и без заполнения, если оно необязательно).
- В админке в разделе заказов откройте свежий заказ и проверьте наличие введённого значения.
- Проверьте письмо с подтверждением заказа (если настроены письма), чтобы убедиться, что поле отображается корректно.
Частые ошибки и как их исправить
- Поле не сохраняется в заказе. Проверьте, что имя поля в форме совпадает с ключом в
$_POSTи что функция сохранения вызывается на правильном хуке. - Поле не отображается в админке. Убедитесь, что используете правильный хук
woocommerce_admin_order_data_after_billing_address, и что ключ метаданных совпадает с сохранённым. - Ошибка валидации, хотя поле необязательно. Проверьте функцию валидации, возможно, там жёстко стоит требование заполнения.
- Данные не отображаются в письме. Используйте именно фильтр
woocommerce_email_order_meta_fields, а не хуки для изменения тела письма напрямую.
Практические советы по безопасности и производительности
- Обязательно используйте
sanitize_text_field()или другие соответствующие функции фильтрации для данных, полученных из$_POST. - Не храните в заказах избыточные данные, если они не нужны для бизнес-логики.
- Если поле содержит чувствительную информацию, подумайте о шифровании или ограничении доступа к этим метаданным через права пользователя.
- В случае большого количества дополнительных полей лучше организовать код в отдельный плагин для удобства поддержки и обновлений.
Таблица сравнения вариантов реализации собственных полей в WooCommerce
| Способ | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Код в functions.php | Быстро, без плагинов, полный контроль | Риск потери при смене темы, требует навыков | Добавление поля с хуками WooCommerce |
| Плагин (например, Checkout Field Editor) | Удобно, визуальный интерфейс | Дополнительная нагрузка, ограниченная кастомизация | Управление полями через админку |
| Собственный плагин | Организованность, переносимость | Требует времени на разработку | Функциональный модуль для проекта |