Диагностика проблемы с отсутствующими товарами в корзине WooCommerce
В стандартной комплектации WooCommerce при добавлении товара в корзину, который затем становится недоступен (отсутствует на складе или удален), отображение стоимости такого товара может отсутствовать или быть некорректным. Это создает путаницу для покупателей и мешает корректному расчету итоговой суммы заказа.
Основные признаки проблемы:
- В корзине отображается сообщение «Товар отсутствует», но его стоимость не видна.
- Общая сумма корзины не учитывает стоимость отсутствующих товаров.
- Отсутствие уведомлений для администратора или пользователя о таком статусе товара.
Причины отсутствия стоимости отсутствующих товаров
WooCommerce по умолчанию исключает из расчёта сумму товаров, которых нет в наличии или которые удалены. Это связано с тем, что метаданные товара (цена, наличие) при удалении товара из базы данных становятся недоступными.
Если товар просто отмечен как «нет в наличии», но не удалён, его цена остаётся доступной, однако фронтенд может не показывать её из-за отсутствия стандартного вывода для таких товаров.
Пошаговое решение: вывод стоимости отсутствующих товаров в корзине
1. Добавление цены в метаданные товара при добавлении в корзину
Чтобы сохранить цену товара, даже если он станет недоступен, нужно при добавлении в корзину копировать цену в данные корзины.
add_filter('woocommerce_add_cart_item_data', 'save_product_price_in_cart_data', 10, 2);
function save_product_price_in_cart_data($cart_item_data, $product_id) {
$product = wc_get_product($product_id);
if ($product) {
$cart_item_data['saved_price'] = $product->get_price();
}
return $cart_item_data;
}2. Изменение отображения стоимости товара в корзине
Заменим вывод цены на сохранённую в корзине, если стандартная цена товара недоступна.
add_filter('woocommerce_cart_item_price', 'display_saved_price_if_product_missing', 10, 3);
function display_saved_price_if_product_missing($price_html, $cart_item, $cart_item_key) {
if (empty($cart_item['data']) || !$cart_item['data']->exists()) {
if (!empty($cart_item['saved_price'])) {
$price = wc_price($cart_item['saved_price']);
return $price . ' <small>(товар отсутствует)</small>';
}
}
return $price_html;
}3. Уведомление пользователя о наличии отсутствующих товаров
Добавим информативное сообщение в корзину с указанием стоимости таких товаров.
add_action('woocommerce_before_cart', 'notify_user_about_missing_products');
function notify_user_about_missing_products() {
$missing_products = false;
foreach (WC()->cart->get_cart() as $cart_item) {
if (empty($cart_item['data']) || !$cart_item['data']->exists()) {
$missing_products = true;
break;
}
}
if ($missing_products) {
wc_print_notice(__('В вашей корзине есть товары, которые сейчас отсутствуют. Их стоимость сохранена для вашего удобства.'), 'notice');
}
}Проверка результата после внедрения кода
Чтобы проверить корректность работы:
- Добавьте товар в корзину.
- Удалите товар из каталога товаров (вручную из админки или через базу).
- Перейдите в корзину и убедитесь, что цена товара отображается с пометкой «товар отсутствует».
- Проверьте вывод уведомления о наличии отсутствующих товаров.
- Убедитесь, что итоговая сумма корзины учитывает стоимость этих товаров.
Частые ошибки и способы их устранения
- Цена не сохраняется при добавлении в корзину: Проверьте, что фильтр
woocommerce_add_cart_item_dataподключён и функция возвращает данные. - Цена отображается некорректно или пусто: Убедитесь, что используется функция
wc_price()для форматирования цены. - Уведомление не появляется: Проверьте, что в корзине действительно есть товары с отсутствующими данными и что хук
woocommerce_before_cartне переопределён другой темой или плагином. - В итоговой сумме отсутствует стоимость отсутствующих товаров: Возможно, потребуется дополнительно модифицировать
woocommerce_calculate_totalsдля добавления сохранённой цены в расчёт.
Оптимизация производительности и безопасность
- Сохраняйте только минимально необходимые данные в
cart_item_data, чтобы не замедлять работу корзины. - Избегайте прямых запросов к базе для проверки существования товара в процессе рендера корзины.
- Обрабатывайте все пользовательские данные с помощью стандартных функций безопасности WordPress и WooCommerce.
Чек-лист для реализации вывода стоимости отсутствующих товаров
- Добавить цену товара в
cart_item_dataпри добавлении в корзину. - Изменить вывод цены в корзине для отсутствующих товаров.
- Добавить уведомление о наличии отсутствующих товаров в корзине.
- Проверить корректность расчёта итоговой суммы.
- Протестировать сценарии с удалением и пометкой товара как отсутствующего.
Сравнение вариантов решения
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Использование плагинов (например, WooCommerce Backorder Manager) | Автоматическое управление отсутствующими товарами и отображение | Простота, поддержка обновлений | Дополнительная нагрузка, возможные конфликты |
| Кастомный код сохранения цены в корзине | Точное управление, легковесность | Гибкость, минимальное влияние на производительность | Требует поддержки и тестирования |
| Удаление отсутствующих товаров из корзины | Автоматическое исключение, отсутствие путаницы | Чистота корзины | Потеря информации о заказе, возможное неудобство для пользователя |