Диагностика задачи: зачем добавлять поле срока годности
Во многих интернет-магазинах, особенно в сегменте продуктов питания, косметики или фармацевтики, важно учитывать срок годности товара при оформлении заказа. Стандартный WooCommerce не содержит такого функционала, поэтому для добавления поля срока годности в корзину и сохранения его в заказ необходимо доработать шаблоны и логику обработки данных.
Шаги реализации: добавление и обработка поля срока годности
1. Добавляем поле срока годности в карточку товара (опционально)
Если необходимо, чтобы покупатель выбирал срок годности на странице товара, добавьте кастомное поле. Например, это может быть дата или выпадающий список с вариантами.
add_action('woocommerce_before_add_to_cart_button', 'add_expiration_date_field');
function add_expiration_date_field() {
echo '<p class="form-field expiration-date">';
echo '<label for="expiration_date">Срок годности</label>';
echo '<input type="date" id="expiration_date" name="expiration_date" required />';
echo '</p>';
}
// Валидация поля
add_filter('woocommerce_add_to_cart_validation', 'validate_expiration_date_field', 10, 3);
function validate_expiration_date_field($passed, $product_id, $quantity) {
if (empty($_POST['expiration_date'])) {
wc_add_notice('Пожалуйста, укажите срок годности.', 'error');
return false;
}
return $passed;
}
// Сохраняем поле в данные корзины
add_filter('woocommerce_add_cart_item_data', 'save_expiration_date_cart_item_data', 10, 2);
function save_expiration_date_cart_item_data($cart_item_data, $product_id) {
if (!empty($_POST['expiration_date'])) {
$cart_item_data['expiration_date'] = sanitize_text_field($_POST['expiration_date']);
}
return $cart_item_data;
}2. Отображаем поле срока годности в корзине и на странице оформления заказа
// Показываем срок годности в корзине
add_filter('woocommerce_get_item_data', 'display_expiration_date_cart', 10, 2);
function display_expiration_date_cart($item_data, $cart_item) {
if (!empty($cart_item['expiration_date'])) {
$item_data[] = array(
'key' => 'Срок годности',
'value' => esc_html($cart_item['expiration_date'])
);
}
return $item_data;
}3. Сохраняем срок годности в метаданные заказа
// При оформлении заказа
add_action('woocommerce_checkout_create_order_line_item', 'add_expiration_date_order_item_meta', 10, 4);
function add_expiration_date_order_item_meta($item, $cart_item_key, $values, $order) {
if (!empty($values['expiration_date'])) {
$item->add_meta_data('Срок годности', $values['expiration_date'], true);
}
}Проверка результата после внедрения
- На странице товара появилось поле выбора даты срока годности.
- При добавлении в корзину без выбора даты выводится ошибка.
- В корзине и на странице оформления заказа отображается выбранный срок годности.
- В админке WooCommerce в деталях заказа в товарных позициях отображается мета "Срок годности" с выбранной датой.
Частые ошибки и как их исправить
- Поле не отображается на странице товара. Проверьте, что хук
woocommerce_before_add_to_cart_buttonкорректно работает с вашей темой. Возможно, тема переопределяет шаблон. Можно использоватьwoocommerce_after_add_to_cart_button. - Данные срока годности не сохраняются в корзине. Убедитесь, что поле имеет атрибут
name="expiration_date"и что вwoocommerce_add_cart_item_dataзначение корректно передаётся. - Срок годности не отображается в заказе. Проверьте, что хук
woocommerce_checkout_create_order_line_itemподключён и не конфликтует с другими плагинами. - Ошибка при валидации даты. Проверьте формат даты и используйте
sanitize_text_fieldдля очистки входных данных.
Практические советы по безопасности и производительности
- Используйте
sanitize_text_fieldи другие функции очистки данных при работе с пользовательским вводом. - Для даты срока годности можно добавить проверку, чтобы не допускать выбор прошедшей даты.
- Если на сайте высокая нагрузка, кешируйте фронтенд, но исключайте страницы корзины и оформления заказа из кеша.
- Для масштабируемости можно реализовать выбор срока годности через атрибуты вариаций товаров, если сроки фиксированы.
Сравнение вариантов реализации
| Вариант | Преимущества | Недостатки |
|---|---|---|
| Добавление поля через кастомный input | Гибкость, подходит для уникальных дат | Необходимо реализовывать валидацию и сохранение вручную |
| Использование вариаций WooCommerce | Автоматическая поддержка, меньше кастомного кода | Подходит только для ограниченного набора дат |
| Плагин для пользовательских полей в WooCommerce | Простота, готовые решения | Дополнительные зависимости, возможные конфликты |