WooCommerce: вывод стоимости отсутствующих товаров в корзине и настройка уведомлений

Диагностика проблемы с отсутствующими товарами в корзине 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.

Чек-лист для реализации вывода стоимости отсутствующих товаров

  1. Добавить цену товара в cart_item_data при добавлении в корзину.
  2. Изменить вывод цены в корзине для отсутствующих товаров.
  3. Добавить уведомление о наличии отсутствующих товаров в корзине.
  4. Проверить корректность расчёта итоговой суммы.
  5. Протестировать сценарии с удалением и пометкой товара как отсутствующего.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Использование плагинов (например, WooCommerce Backorder Manager)Автоматическое управление отсутствующими товарами и отображениеПростота, поддержка обновленийДополнительная нагрузка, возможные конфликты
Кастомный код сохранения цены в корзинеТочное управление, легковесностьГибкость, минимальное влияние на производительностьТребует поддержки и тестирования
Удаление отсутствующих товаров из корзиныАвтоматическое исключение, отсутствие путаницыЧистота корзиныПотеря информации о заказе, возможное неудобство для пользователя
Как добавить вывод стоимости отсутствующих товаров в корзине WooCommerce
01.05.2026
WooCommerce: как удалить заблокированные товары без риска
17.07.2026
Как создать собственный тип записи в WordPress: пошаговое руководство
05.11.2025
Автоматическое создание отчетов по продажам WooCommerce с примерами кода
18.02.2026
WooCommerce: как настроить автоматическое возврат денег за отменённые заказы
05.07.2026

Совсем скоро здесь заработает сайт о вордпресс. И будет он связан с продажами, магазинами или чем-то таким.