Зачем добавлять поле срока годности в корзину WooCommerce
В интернет-магазинах с товарами, у которых есть ограниченный срок годности (например, продукты питания, косметика, лекарства), важно получать от покупателя информацию о нужном сроке хранения или дате использования. Стандартный WooCommerce не поддерживает такую кастомизацию на уровне корзины и оформления заказа, поэтому нужно внедрять дополнительное поле для ввода срока годности.
Диагностика проблемы: стандартные возможности WooCommerce
WooCommerce позволяет добавлять пользовательские поля к товарам (custom product fields), но в корзине и на странице оформления заказа поля для срока годности не предусмотрены. Без кастомного кода или плагина нельзя получить от пользователя и сохранить эту информацию вместе с заказом.
Проверить отсутствие поля легко: откройте страницу корзины и оформления заказа — вы не увидите поля для срока годности.
Пошаговое решение: добавляем поле срока годности в корзину и оформление заказа
1. Добавляем поле срока годности на страницу корзины
Используем хук woocommerce_after_cart_item_name для вывода поля ввода рядом с названием товара в корзине:
add_action('woocommerce_after_cart_item_name', 'add_expiry_date_field_to_cart', 10, 2);
function add_expiry_date_field_to_cart($cart_item, $cart_item_key) {
if (isset($cart_item['expiry_date'])) {
$expiry_date = $cart_item['expiry_date'];
} else {
$expiry_date = '';
}
echo '<label for="expiry_date_' . esc_attr($cart_item_key) . '">Срок годности:</label>';
echo '<input type="date" id="expiry_date_' . esc_attr($cart_item_key) . '" name="expiry_date[' . esc_attr($cart_item_key) . ']" value="' . esc_attr($expiry_date) . '" />';
}2. Обрабатываем и сохраняем данные при обновлении корзины
Чтобы данные сохранились в сессии, нужно перехватить обновление корзины и сохранить поле в данных товара:
add_action('woocommerce_cart_updated', 'save_expiry_date_field_in_cart');
function save_expiry_date_field_in_cart() {
if (!isset($_POST['expiry_date']) || !is_array($_POST['expiry_date'])) {
return;
}
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
if (isset($_POST['expiry_date'][$cart_item_key])) {
$expiry_date = sanitize_text_field($_POST['expiry_date'][$cart_item_key]);
WC()->cart->cart_contents[$cart_item_key]['expiry_date'] = $expiry_date;
}
}
}3. Передаем срок годности в заказ
Используем хук woocommerce_checkout_create_order_line_item, чтобы прикрепить срок годности к каждой позиции заказа:
add_action('woocommerce_checkout_create_order_line_item', 'add_expiry_date_to_order_items', 10, 4);
function add_expiry_date_to_order_items($item, $cart_item_key, $values, $order) {
if (!empty($values['expiry_date'])) {
$item->add_meta_data('Срок годности', $values['expiry_date'], true);
}
}4. Отображаем срок годности в админке WooCommerce
Чтобы видеть срок годности в заказах админки, добавьте вывод мета-поля:
add_action('woocommerce_admin_order_item_headers', 'add_expiry_date_column_header');
add_action('woocommerce_admin_order_item_values', 'add_expiry_date_column_value', 10, 3);
function add_expiry_date_column_header() {
echo '<th class="expiry_date_column">Срок годности</th>';
}
function add_expiry_date_column_value($_product, $item, $item_id) {
$expiry_date = $item->get_meta('Срок годности');
echo '<td>' . esc_html($expiry_date) . '</td>';
}Проверка результата после внедрения
- На странице корзины рядом с каждым товаром появилось поле ввода даты.
- При вводе даты и обновлении корзины данные сохраняются и не исчезают.
- При оформлении заказа срок годности передается в позиции заказа (проверьте через админку WooCommerce в деталях заказа).
- В админке WooCommerce в таблице заказа отображается столбец с введенным сроком годности.
Частые ошибки и как их исправить
- Поле не сохраняется после обновления корзины. Проверьте, что вы правильно используете хук
woocommerce_cart_updatedи корректно обрабатываете массив$_POST['expiry_date']. - Данные не попадают в заказ. Убедитесь, что метаполя добавляются через
woocommerce_checkout_create_order_line_itemи что ключи массива совпадают. - Ошибка вывода в админке. Проверьте, что функции вывода метаданных подключены к правильным хукам (
woocommerce_admin_order_item_headersиwoocommerce_admin_order_item_values). - Неправильный формат даты. Используйте тип поля
dateв HTML и sanitize сsanitize_text_fieldили лучшеsanitize_text_fieldс дополнительной валидацией формата даты.
Практические советы по безопасности и производительности
- Всегда используйте
sanitize_text_fieldдля входящих данных из формы. - Для более строгой проверки даты используйте PHP-функцию
DateTime::createFromFormatперед сохранением. - Не храните срок годности в пользовательских мета, а привязывайте к позиции заказа, чтобы избежать потери данных при изменениях.
- Минимизируйте добавление лишних запросов и операций при обработке корзины, чтобы не замедлить процесс оформления заказа.
Сравнение способов реализации поля срока годности
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код (как в статье) | Полный контроль, без плагинов, легко кастомизировать | Требует навыков, нужно тестировать | Добавление поля в корзину через хуки |
| Плагин Custom Checkout Fields | Простота, быстрый старт | Может грузить сайт, не всегда гибко | Advanced Custom Fields + интеграция с WooCommerce |
| Использование пользовательских атрибутов товара | Можно задать заранее | Не дает ввод от пользователя на этапе корзины | Стандартные атрибуты WooCommerce |