Диагностика проблемы: почему товары с нулевым остатком остаются в каталоге
В WooCommerce товары с отсутствующим запасом (stock = 0) по умолчанию остаются видимыми в каталоге. Это может сбивать покупателей с толку и ухудшать пользовательский опыт, так как товары нельзя купить, но они все еще отображаются. Важно понять, как и когда WooCommerce учитывает запасы и отображает товары, а также какие настройки влияют на их видимость.
Основные причины, по которым товары с нулевым остатком остаются в каталоге:
- Опция
Включать товары без запаса в каталогвключена в настройках WooCommerce. - Отсутствие автоматической фильтрации товаров по наличию на складе.
- Кеширование страниц каталога мешает обновлению отображения товаров.
Пошаговое решение: автоматическое удаление или скрытие товаров с нулевым остатком
1. Проверка и настройка параметров WooCommerce
Перейдите в WooCommerce > Настройки > Товары > Запасы. Найдите опцию Включать товары без запаса в каталог и Включать товары без запаса в поиск. По умолчанию эти опции могут быть включены. Чтобы товары с нулевым остатком не отображались, их нужно отключить.
Однако, если задача — именно удалять товары (а не просто скрывать), потребуется кастомный код.
2. Автоматическое удаление товаров с нулевым остатком через хук
Реализуем автоматический удаление товаров со складом 0 при обновлении их запаса. Добавьте в functions.php вашей дочерней темы или в кастомный плагин следующий код:
add_action('woocommerce_update_product', 'auto_delete_sold_out_product', 10, 1);
function auto_delete_sold_out_product($product_id) {
$product = wc_get_product($product_id);
if (!$product) return;
// Проверяем, управляется ли запасом и есть ли остаток
if ($product->managing_stock() && $product->get_stock_quantity() !== null) {
if ($product->get_stock_quantity() <= 0) {
// Удаляем товар
wp_delete_post($product_id, true); // true — безвозвратное удаление
}
}
}Этот код реагирует на любое обновление товара и проверяет количество на складе. Если количество меньше или равно нулю, товар удаляется из базы.
3. Альтернатива: скрыть товары с нулевым остатком вместо удаления
Удаление товара — радикальный шаг, возможно, лучше скрывать такие товары без удаления, чтобы сохранить историю и данные. Для этого можно использовать фильтр WooCommerce:
add_action('pre_get_posts', 'exclude_sold_out_products_from_catalog');
function exclude_sold_out_products_from_catalog($query) {
if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_category() || is_product_tag())) {
$meta_query = $query->get('meta_query');
if (!$meta_query) {
$meta_query = [];
}
$meta_query[] = [
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => '!='
];
$query->set('meta_query', $meta_query);
}
}Этот код исключит из каталога и архива товаров все позиции со статусом outofstock.
Проверка результата после внедрения
Чтобы убедиться, что решение работает:
- Создайте тестовый товар с управлением запасами и установите количество в 0.
- Обновите товар через админку.
- Проверьте каталог и страницы категорий — товар должен либо исчезнуть, либо быть удалён полностью.
- Если код на удаление — попробуйте найти товар в админке или через поиск — он должен отсутствовать.
- Если код на скрытие — товар не должен отображаться в каталоге, но останется в базе.
Частые ошибки и как их исправить
- Товар не удаляется: проверьте, что хук
woocommerce_update_productсрабатывает. Можно добавитьerror_logдля отладки. - Удаление происходит не для всех товаров: убедитесь, что товары управляют запасами (
manage_stockвключен). - Товары с нулевым остатком всё еще видны: проверьте кеширование (например, плагин кеша, CDN). Очистите кеш.
- Появляются ошибки доступа при удалении: проверьте права пользователя, от имени которого выполняется код (обычно администратор).
Практические советы по безопасности и производительности
- Удаление товаров — операция необратимая при
wp_delete_post($id, true). Рекомендуется сначала делать резервные копии базы. - Если вы используете автоматическую очистку, добавьте логирование действий — так проще отследить удалённые товары.
- Храните код в дочерней теме или отдельном плагине, чтобы не потерять его при обновлении.
- Избегайте удаления товаров в пиковые часы нагрузки, чтобы не замедлять сайт.
- Для больших магазинов с тысячами товаров рассмотрите выполнение удаления через WP-CLI или отдельный скрипт по cron, чтобы избежать таймаутов.
Сравнение способов решения задачи
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Отключение показа через настройки WooCommerce | Стандартные настройки для скрытия товаров без остатка | Просто, не требует кода | Товары остаются в базе, не удаляются |
Скрытие через фильтр pre_get_posts | Кодовое исключение товаров из вывода каталога | Безопасно, сохраняет данные товаров | Товары всё равно доступны в админке и по прямой ссылке |
Автоматическое удаление через хук woocommerce_update_product | Удаление товаров при обновлении с нулевым запасом | Полное удаление, чистота базы | Риск потери данных, требует резервных копий |