Диагностика задачи: зачем добавлять собственные данные в заказ WooCommerce
В стандартной форме оформления заказа WooCommerce отсутствуют специфичные для бизнеса поля, например, дополнительные инструкции, ID клиента в CRM, внутренние комментарии и т.п. Для хранения таких данных их нужно добавить в заказ, иначе они потеряются после оформления.
Задача: добавить произвольное поле в форму оформления, сохранить данные в метаданные заказа и отобразить их в админке WooCommerce.
Шаг 1. Добавляем поле в форму оформления заказа
Для вывода нового поля используем хук woocommerce_after_order_notes. Пример добавления текстового поля "Номер клиента":
add_action('woocommerce_after_order_notes', 'wppr_add_custom_checkout_field');
function wppr_add_custom_checkout_field($checkout) {
echo '<div id="custom_checkout_field">';
woocommerce_form_field('client_number', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Номер клиента'),
'placeholder' => __('Введите номер клиента'),
'required' => false,
), $checkout->get_value('client_number'));
echo '</div>';
}Шаг 2. Сохраняем данные в метаданные заказа
Используем хук woocommerce_checkout_update_order_meta, который вызывается после успешного оформления заказа. Здесь нужно получить данные из $_POST и записать их в заказ:
add_action('woocommerce_checkout_update_order_meta', 'wppr_save_custom_checkout_field');
function wppr_save_custom_checkout_field($order_id) {
if (!empty($_POST['client_number'])) {
update_post_meta($order_id, '_client_number', sanitize_text_field($_POST['client_number']));
}
}Шаг 3. Отображаем данные в админке заказа WooCommerce
Для удобства просмотра добавим поле в метабоксы редактирования заказа через хук woocommerce_admin_order_data_after_billing_address:
add_action('woocommerce_admin_order_data_after_billing_address', 'wppr_display_custom_field_admin_order', 10, 1);
function wppr_display_custom_field_admin_order($order){
$client_number = get_post_meta($order->get_id(), '_client_number', true);
if ($client_number) {
echo '<p><strong>Номер клиента:</strong> ' . esc_html($client_number) . '</p>';
}
}Проверка результата после внедрения
- Зайдите на страницу оформления заказа, под полем "Примечания" появится поле "Номер клиента".
- Заполните поле и оформите заказ.
- В админке WooCommerce откройте заказ — в блоке с данными плательщика появится сохранённое значение.
Частые ошибки и как их исправить
- Поле не отображается в форме: проверьте, что код добавлен в functions.php активной темы или в плагин, и что функция добавлена в нужный хук.
- Данные не сохраняются: убедитесь, что имя поля в
$_POSTсовпадает с именем в форме, и используйтеsanitize_text_fieldдля очистки. - Данные не отображаются в админке: проверьте правильность ID заказа и ключа метаданных, а также используемый хук для вывода.
Практические советы по безопасности и производительности
- Всегда валидируйте и санитайзите пользовательский ввод перед сохранением — используйте
sanitize_text_field,intvalи т.п. - Для обязательных полей добавьте проверку на стороне сервера через
woocommerce_checkout_process, чтобы предотвратить оформление без нужных данных. - Избегайте записи больших объемов данных в метаданные заказа, чтобы не замедлять загрузку страницы редактирования.
Чек-лист для добавления произвольных полей в заказ WooCommerce
- Добавить поле в форму оформления заказа (хук
woocommerce_after_order_notes) - Сохранить данные в метаданные заказа (хук
woocommerce_checkout_update_order_meta) - Отобразить данные в админке заказа (хук
woocommerce_admin_order_data_after_billing_address) - Добавить серверную валидацию (по необходимости) через
woocommerce_checkout_process - Санитайзить данные перед сохранением
Сравнение вариантов добавления пользовательских данных в заказ WooCommerce
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Добавление поля в форму и сохранение через хуки | Полный контроль, без сторонних плагинов | Требует кода, больше времени на отладку | Код из статьи |
| Плагины для кастомизации оформления заказа (например, Checkout Field Editor) | Простота, удобный UI для настроек | Дополнительная нагрузка, ограничения в бесплатных версиях | Checkout Field Editor, Flexible Checkout Fields |
| Использование ACF (Advanced Custom Fields) | Гибкость, множество типов полей | Сложнее интегрировать с оформлением заказа | ACF + кастомный код |