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

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

В WooCommerce товары с нулевым или отрицательным количеством на складе часто продолжают отображаться на сайте, если не настроена автоматическая фильтрация. Это приводит к неудобствам для пользователей и снижению конверсии. Особенно актуально для магазинов с большим ассортиментом и частыми изменениями наличия товаров.

Проверьте текущие настройки WooCommerce в разделе WooCommerce > Настройки > Товары > Запасы. Опция «Скрывать товары без наличия» должна быть включена для базового решения. Однако она не всегда работает с кастомными типами товаров или при использовании сложных плагинов.

Как проверить, что товары без склада отображаются

  • Откройте каталог магазина и найдите товары с количеством на складе 0 или меньше.
  • В панели администратора перейдите в список товаров, включите столбец «Наличие» и убедитесь, что такие товары видны на сайте.

Пошаговое решение: автоматическое удаление товаров без склада из каталога

1. Включение стандартной опции скрытия товаров без наличия

Перейдите в WooCommerce > Настройки > Товары > Запасы и активируйте галочку «Скрывать товары без наличия». Это базовое решение, но не всегда достаточно.

2. Добавление кастомного кода для удаления таких товаров из каталога

Для более надежной фильтрации подойдет добавление фильтра к основному запросу WooCommerce, исключающего товары с запасом 0 или ниже. Добавьте следующий код в functions.php вашей темы или в кастомный плагин:

add_action('pre_get_posts', 'exclude_out_of_stock_products_from_catalog');
function exclude_out_of_stock_products_from_catalog($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }
    if (is_shop() || is_product_taxonomy()) {
        $meta_query = (array) $query->get('meta_query');
        $meta_query[] = array(
            'key' => '_stock_status',
            'value' => 'outofstock',
            'compare' => '!='
        );
        $query->set('meta_query', $meta_query);
    }
}

Этот код исключает из каталога все товары с мета-ключом _stock_status, равным outofstock, то есть без наличия.

3. Удаление товаров без склада из базы (если требуется полный CleanUp)

Если нужно не просто скрыть, а полностью удалить такие товары, можно создать WP-CLI команду или скрипт для удаления:

function delete_out_of_stock_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ),
        ),
        'fields'         => 'ids',
    );
    $products = get_posts($args);
    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // true — безвозвратно
    }
}

Вызовите эту функцию вручную или настройте WP-Cron для периодического запуска.

Проверка результата

  • Обновите страницу каталога и убедитесь, что товары с нулевым или отрицательным запасом не отображаются.
  • В админке проверьте, что товары без склада либо скрыты, либо удалены (в зависимости от выбранного метода).
  • Для полного удаления — проверьте таблицу wp_posts и наличие товаров с post_type = 'product' и _stock_status = 'outofstock'.

Частые ошибки и их исправление

  • Код не работает на странице архива — проверьте, что условие is_shop() || is_product_taxonomy() охватывает все нужные страницы (например, категории товаров). При необходимости добавьте другие условные теги.
  • Плагин кэширования мешает изменениям — очистите кэш сайта и браузера после внесения изменений.
  • Метаданные товаров не обновлены — убедитесь, что у товаров корректно установлен _stock_status, например с помощью плагина «Adminer» или через консоль MySQL.
  • Удаление товаров происходит не полностью — проверьте права пользователя, под которым запускается скрипт, и убедитесь, что wp_delete_post вызывается с параметром true для безвозвратного удаления.

Практические советы по безопасности и производительности

  • Перед массовым удалением товаров сделайте резервную копию базы данных.
  • Если товаров очень много, удаление лучше выполнять пакетами, чтобы не перегружать сервер.
  • Для фильтрации товаров по складу используйте мета-ключ _stock_status, а не _stock, так как первый оптимизирован WooCommerce для таких запросов.
  • Для улучшения производительности используйте объектный кеш и избегайте избыточных запросов в цикле.
  • Если используете сторонние плагины управления запасами, убедитесь, что они совместимы с вашим кодом.

Сравнение методов удаления товаров без склада

МетодОписаниеПлюсыМинусы
Настройка WooCommerceВключение опции скрытия товаров без наличияПростота, не требует кодаНе всегда работает с кастомами, не удаляет товары
Фильтр pre_get_postsИсключение товаров с _stock_status=outofstock из выводаГибко, работает для всех страниц каталогаТовары остаются в базе, требуют поддержки
Массовое удаление через скриптБезвозвратное удаление товаров из БДПолное очищение каталогаРиск потери данных, требует резервного копирования
Как отключить AJAX в WooCommerce без потери функциональности
08.12.2025
Отложенная загрузка картинок в WordPress: настройка и примеры
26.02.2026
Как создать динамические формы в WordPress с помощью REST API
07.04.2026
WooCommerce: как автоматически удалять товары без склада из каталога
26.07.2026
Как добавить владельца (автора) постов в WordPress и управлять им программно
20.02.2026