Диагностика: зачем кастомизировать корзину WooCommerce и какие задачи решают хуки
Корзина на WooCommerce — ключевой элемент пользовательского пути. Часто стандартный функционал не покрывает бизнес-задачи: нужно добавить дополнительные поля, изменить вывод элементов, добавить свои сообщения или изменить логику подсчета стоимости. Лучший способ — использовать хуки (actions и filters), которые предоставляет WooCommerce, чтобы не менять исходный код плагина и сохранить совместимость с обновлениями.
Основные хуки для кастомизации корзины WooCommerce
Самые востребованные хуки для работы с корзиной:
woocommerce_before_cart— вывод до содержимого корзины;woocommerce_after_cart— вывод после содержимого корзины;woocommerce_cart_item_name— фильтр названия товара в корзине;woocommerce_cart_item_price— фильтр цены товара в корзине;woocommerce_cart_item_quantity— фильтр количества товара в корзине;woocommerce_cart_totals_before_order_total— вывод перед итоговой суммой;woocommerce_cart_calculate_fees— добавление дополнительных сборов;woocommerce_after_cart_item_quantity_update— действие после обновления количества товара.
Пошаговое решение: добавляем поле "Комментарий к товару" в корзину для каждого товара
Задача: дать пользователю возможность добавить комментарий к каждому товару прямо в корзине, чтобы потом сохранить его в мета-данных заказа.
1. Добавляем поле комментария на страницу корзины
add_filter('woocommerce_cart_item_name', 'add_comment_field_to_cart_item', 10, 3);
function add_comment_field_to_cart_item($product_name, $cart_item, $cart_item_key) {
$comment = isset(WC()->session->get('cart_comments')[$cart_item_key]) ? WC()->session->get('cart_comments')[$cart_item_key] : '';
$field = '<label for="comment_'.esc_attr($cart_item_key).'">Комментарий:</label>'
.'<input type="text" id="comment_'.esc_attr($cart_item_key).'" name="cart_comments['.esc_attr($cart_item_key).']" value="'.esc_attr($comment).'" style="margin-left:10px;"/>';
return $product_name . $field;
}2. Сохраняем комментарии при обновлении корзины
add_action('woocommerce_cart_updated', 'save_cart_comments');
function save_cart_comments() {
if (isset($_POST['cart_comments']) && is_array($_POST['cart_comments'])) {
WC()->session->set('cart_comments', array_map('sanitize_text_field', $_POST['cart_comments']));
}
}3. Сохраняем комментарии в метаданных заказа при оформлении
add_action('woocommerce_checkout_create_order_line_item', 'add_comment_to_order_items', 10, 4);
function add_comment_to_order_items($item, $cart_item_key, $values, $order) {
$comments = WC()->session->get('cart_comments');
if (!empty($comments[$cart_item_key])) {
$item->add_meta_data('Комментарий к товару', $comments[$cart_item_key]);
}
}4. Очищаем комментарии после оформления заказа
add_action('woocommerce_thankyou', 'clear_cart_comments_session');
function clear_cart_comments_session($order_id) {
WC()->session->__unset('cart_comments');
}Проверка результата после внедрения
- Перейдите в корзину, убедитесь, что возле каждого товара появилось поле «Комментарий».
- Заполните поле, обновите корзину, проверьте, что введённый текст не пропадает.
- Оформите заказ, зайдите в админку WooCommerce — в заказе у каждого товара должен отображаться комментарий в мета-данных.
Частые ошибки и как их исправить
- Комментарии не сохраняются между обновлениями корзины: Проверьте, что сессия WooCommerce включена и работает, и что при обновлении корзины отправляется поле
cart_comments. - Комментарии не видны в заказе: Убедитесь, что хук
woocommerce_checkout_create_order_line_itemподключён и метаданные добавляются в правильном формате. - Ошибка при обновлении корзины: Проверьте, что все данные проходят фильтрацию через
sanitize_text_fieldи что нет конфликтов с другими плагинами.
Практические советы по безопасности и производительности
- Всегда фильтруйте и проверяйте входящие данные перед сохранением в сессию или базу данных.
- Используйте сессию WooCommerce для временного хранения данных корзины, а не cookies или $_POST напрямую.
- Добавляйте минимальный JavaScript, чтобы не перегружать страницу, лучше использовать штатные механизмы WooCommerce.
- При большом количестве товаров в корзине учитывайте, что дополнительные поля могут влиять на скорость загрузки корзины.
Сравнение вариантов реализации поля комментария в корзине
| Метод | Код | Плюсы | Минусы |
|---|---|---|---|
| Сессия + хуки (текущий способ) | Пример выше | Простота, сохраняется между обновлениями, данные в заказе | Зависит от сессии, не подходит для долгих сессий без активности |
| Пользовательские таблицы базы данных | Требует создания таблиц и запросов | Поддержка больших данных, долговременное хранение | Сложнее в реализации, нагрузка на базу |
| AJAX сохранение комментариев | JS + PHP обработчик | Быстрое обновление без перезагрузки | Нужен дополнительный JS, сложнее поддерживать |