WooCommerce: автоматическое удаление товаров с нулевым остатком из каталога

Диагностика проблемы: почему товары с нулевым остатком остаются в каталоге

В 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Удаление товаров при обновлении с нулевым запасомПолное удаление, чистота базыРиск потери данных, требует резервных копий

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: автоматическое отключение способов доставки по регионам
24.07.2026
WooCommerce: автоматическое изменение стоимости и складского остатка при обновлении заказа
07.05.2026
WooCommerce: автоматическое изменение цены товара при обновлении заказа
18.05.2026
WooCommerce: как отключить способы доставки для определённых товаров
09.08.2026
Как создать автоматический sitemap в WordPress без плагинов
12.04.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше