Проблема: отсутствие информации о стоимости товаров, которых нет в наличии, в корзине WooCommerce
По умолчанию WooCommerce при добавлении в корзину товаров с нулевым остатком либо не позволяет их добавить, либо отображает их без указания стоимости. Это создает неудобство для покупателей и владельцев магазинов, которые хотят видеть общую сумму потенциального заказа, включая товары под заказ или временно отсутствующие. В этой статье разберем, как добавить вывод стоимости отсутствующих товаров прямо в корзине.
Диагностика проблемы
Для начала убедитесь, что в настройках WooCommerce разрешена возможность заказа отсутствующих товаров:
- Перейдите в WooCommerce → Настройки → Товары → Управление запасами.
- Проверьте, что включена опция Разрешить заказ при отсутствии запаса.
Если опция включена, но стоимость отсутствующих товаров не отображается в корзине, значит нужно добавить кастомный функционал для вывода цены таких товаров.
Пошаговое решение: как вывести стоимость отсутствующих товаров в корзине
1. Используем хук woocommerce_cart_item_name для добавления цены под названием товара
Добавим функцию, которая будет проверять наличие товара и в случае отсутствия запаса выводить цену под названием товара в корзине.
add_filter('woocommerce_cart_item_name', 'show_price_for_out_of_stock_items', 10, 3);function show_price_for_out_of_stock_items($product_name, $cart_item, $cart_item_key) { $product = $cart_item['data']; if ($product->managing_stock() && $product->is_on_backorder($cart_item['quantity'])) { $price_html = wc_price($product->get_price()); $product_name .= '<br><small style="color:#d9534f;">Цена при отсутствии товара: ' . $price_html . '</small>'; } return $product_name;}2. Дополнительно: выводим суммарную стоимость отсутствующих товаров в футере корзины
Чтобы покупатель видел общую сумму товаров, которых нет в наличии, добавим эту сумму в нижнюю часть страницы корзины.
add_action('woocommerce_cart_totals_after_order_total', 'show_backorder_items_total');function show_backorder_items_total() { $backorder_total = 0; foreach (WC()->cart->get_cart() as $cart_item) { $product = $cart_item['data']; if ($product->managing_stock() && $product->is_on_backorder($cart_item['quantity'])) { $backorder_total += $product->get_price() * $cart_item['quantity']; } } if ($backorder_total > 0) { echo '<tr class="backorder-total"><th>Стоимость отсутствующих товаров</th><td>' . wc_price($backorder_total) . '</td></tr>'; }}Для корректного отображения добавьте следующий CSS в файл стилей вашей темы или в раздел кастомных стилей:
.backorder-total th, .backorder-total td { font-weight: 700; color: #d9534f;}Проверка результата
- Добавьте в корзину товар с нулевым остатком и включенным заказом под заказ.
- Перейдите на страницу корзины и убедитесь, что под названием товара отображается цена с пометкой.
- Проверьте, что в итоговой сумме корзины появилась строка с общей стоимостью отсутствующих товаров.
Частые ошибки и как их исправить
- Цена не отображается: проверьте, что у товара установлен правильный тип управления запасами и включен backorder. Функция
is_on_backorder()возвращает true только в этом случае. - Строка с суммой отсутствующих товаров не появляется: возможно, корзина очищена или товары не отмечены как backorder. Используйте режим отладки WooCommerce для проверки состояния корзины.
- Отображение ломает верстку корзины: убедитесь, что HTML и CSS корректны, а тема не переопределяет стандартные шаблоны WooCommerce без учета новых строк.
Практические советы для производительности и безопасности
- Не используйте тяжелые запросы или дополнительные циклы в хуках, работающих на странице корзины — это может замедлить загрузку.
- Всегда тестируйте изменения на staging-сайте или локальной копии перед внедрением на рабочий магазин.
- Используйте дочернюю тему для добавления кастомного кода, чтобы избежать потери изменений при обновлении темы.
- Для защиты от XSS убедитесь, что все данные, выводимые в HTML, проходят экранирование, например, через
esc_html()или аналогичные функции, где это необходимо.
Сравнение подходов: плагин vs кастомный код
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Готовый плагин для отображения backorder цены | Простота установки и настройки, поддержка обновлений | Может содержать лишний функционал, нагрузка на сайт | Использовать, если нет опыта PHP |
| Кастомный код в functions.php | Точный контроль, минимум лишнего кода, легкий и быстрый | Требует навыков программирования, поддержка ложится на вас | Оптимальное решение для разработчиков |