Зачем добавлять дополнительные поля в WooCommerce
Стандартные формы WooCommerce для регистрации и оформления заказа не всегда покрывают все потребности бизнеса. Часто требуется собрать дополнительные данные — например, идентификационный номер клиента, дату рождения или согласие на обработку персональных данных. В этой статье разберём, как добавить кастомные поля в форму регистрации и оформления заказа, сохранить их в метаданных пользователя и заказа, а также вывести эти данные в админке.
Диагностика проблемы: как понять, что нужно добавить поле
Прежде чем внедрять изменения, убедитесь, что стандартных полей WooCommerce недостаточно. Задайте себе вопросы:
- Есть ли данные, которые критично важно получить при регистрации или заказе?
- Можно ли обойтись без дополнительных плагинов?
- Как должна выглядеть валидация новых полей?
Если ответ «да» на первый вопрос, значит, нужно добавлять поля программно.
Как добавить дополнительное поле в форму регистрации WooCommerce
Чтобы добавить поле, воспользуемся хуком woocommerce_register_form. Для валидации — woocommerce_register_post, а для сохранения — user_register.
<?php
// Добавляем поле в форму регистрации
add_action('woocommerce_register_form', 'add_custom_registration_field');
function add_custom_registration_field() {
?>
<p class="form-row form-row-wide">
<label for="birthday">Дата рождения <span class="required">*</span></label>
<input type="date" class="input-text" name="birthday" id="birthday" value="<?php if (!empty($_POST['birthday'])) echo esc_attr($_POST['birthday']); ?>" />
</p>
<?php
}
// Валидируем поле
add_action('woocommerce_register_post', 'validate_custom_registration_field', 10, 3);
function validate_custom_registration_field($username, $email, $validation_errors) {
if (empty($_POST['birthday'])) {
$validation_errors->add('birthday_error', 'Пожалуйста, укажите дату рождения.');
}
}
// Сохраняем поле
add_action('user_register', 'save_custom_registration_field');
function save_custom_registration_field($user_id) {
if (!empty($_POST['birthday'])) {
update_user_meta($user_id, 'birthday', sanitize_text_field($_POST['birthday']));
}
}
?>Как добавить дополнительные поля в оформление заказа WooCommerce
Добавление поля на страницу оформления заказа
Используем хук woocommerce_after_order_notes для вывода поля и woocommerce_checkout_process для валидации.
<?php
// Добавляем поле
add_action('woocommerce_after_order_notes', 'add_custom_checkout_field');
function add_custom_checkout_field($checkout) {
echo '<div id="custom_checkout_field">';
woocommerce_form_field('delivery_instructions', array(
'type' => 'textarea',
'class' => array('form-row-wide'),
'label' => 'Инструкции для доставки',
'placeholder' => 'Укажите пожелания по доставке',
'required' => false,
), $checkout->get_value('delivery_instructions'));
echo '</div>';
}
// Валидация
add_action('woocommerce_checkout_process', 'validate_custom_checkout_field');
function validate_custom_checkout_field() {
if (isset($_POST['delivery_instructions']) && strlen($_POST['delivery_instructions']) > 500) {
wc_add_notice('Инструкции для доставки не должны превышать 500 символов.', 'error');
}
}
// Сохраняем данные в метаданные заказа
add_action('woocommerce_checkout_update_order_meta', 'save_custom_checkout_field');
function save_custom_checkout_field($order_id) {
if (!empty($_POST['delivery_instructions'])) {
update_post_meta($order_id, 'delivery_instructions', sanitize_textarea_field($_POST['delivery_instructions']));
}
}
?>Вывод дополнительных полей в админке WooCommerce
Чтобы видеть данные в карточке заказа, используем хук woocommerce_admin_order_data_after_billing_address.
<?php
add_action('woocommerce_admin_order_data_after_billing_address', 'display_custom_checkout_field_admin_order', 10, 1);
function display_custom_checkout_field_admin_order($order){
$delivery_instructions = get_post_meta($order->get_id(), 'delivery_instructions', true);
if ($delivery_instructions) {
echo '<p><strong>Инструкции для доставки:</strong> ' . esc_html($delivery_instructions) . '</p>';
}
}
?>Проверка результата после внедрения
- Зарегистрируйтесь как новый пользователь, заполнив поле «Дата рождения» — проверьте, что ошибка появляется при пустом поле и что данные сохраняются в базе (meta_key = birthday).
- Оформите заказ, заполнив поле «Инструкции для доставки», проверьте, что данные сохраняются и отображаются в админке заказа.
- Проверьте в базе данных таблицы
wp_usermetaиwp_postmetaна наличие новых ключей и значений.
Частые ошибки при добавлении кастомных полей в WooCommerce
- Поле не отображается в форме. Убедитесь, что функция добавления поля привязана к правильному хуку и что код подключен в functions.php или плагине.
- Данные не сохраняются. Часто забывают реализовать сохранение через хуки
user_registerилиwoocommerce_checkout_update_order_meta. - Валидация не работает. Проверьте, что хук валидации вызывается и что ошибки добавляются через
wc_add_noticeили$validation_errors->add(). - Данные не отображаются в админке. Нужно использовать правильный хук для вывода метаданных заказа —
woocommerce_admin_order_data_after_billing_address.
Практические советы по безопасности и производительности
- Используйте функции очистки данных:
sanitize_text_field,sanitize_textarea_field,esc_htmlдля вывода. - Не храните чувствительные данные в открытом виде — применяйте шифрование при необходимости.
- Для производительности не создавайте слишком много дополнительных полей, чтобы не перегружать базу.
- Тестируйте изменения на тестовом сайте перед внедрением в продакшен.
Сравнение способов добавления дополнительных полей в WooCommerce
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Добавление через код в functions.php | Полный контроль, оптимизация, минимум плагинов | Требует знаний PHP, больше времени | Примеры из статьи |
| Использование плагинов (например, Checkout Field Editor) | Быстро, без кода, удобный интерфейс | Нагрузка на сайт, ограниченная кастомизация | Clearfy (оптимизация и управление полями) |