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

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

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

Проверить текущие настройки можно в админке в разделе WooCommerce → Настройки → Товары → Запасы. Здесь есть опция Скрывать товары при отсутствии на складе. Но если она не активирована или если нужна именно автоматическая удаление товара из каталога (а не просто скрытие), потребуется кастомное решение.

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

1. Проверка включения управления запасами

Убедитесь, что управление запасами включено глобально и отдельно для каждого товара:

function is_stock_management_enabled() {
    return wc_stock_enabled();
}

2. Создание WP-Cron задачи для регулярной проверки товаров

Добавим функцию, которая будет запускаться ежедневно и удалять товары с запасом 0:

function wpaction_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',
    );
    $query = new WP_Query($args);

    if ( ! empty($query->posts) ) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // true - удалить без возможности восстановления
        }
    }
}

// Регистрация события для cron
if (! wp_next_scheduled('wpaction_daily_delete_out_of_stock_products')) {
    wp_schedule_event(time(), 'daily', 'wpaction_daily_delete_out_of_stock_products');
}

add_action('wpaction_daily_delete_out_of_stock_products', 'wpaction_delete_out_of_stock_products');

3. Немедленное удаление товара при обновлении запаса (опционально)

Если нужно, чтобы товар удалялся сразу, как только запас стал 0, можно повесить хук на обновление мета поля:

function wpaction_delete_product_if_out_of_stock($meta_id, $post_id, $meta_key, $meta_value) {
    if ($meta_key === '_stock_status' && $meta_value === 'outofstock') {
        wp_delete_post($post_id, true);
    }
}
add_action('updated_postmeta', 'wpaction_delete_product_if_out_of_stock', 10, 4);
add_action('added_postmeta', 'wpaction_delete_product_if_out_of_stock', 10, 4);

Проверка результата после внедрения

  • Зайдите в админку WooCommerce → Товары и убедитесь, что товары с запасом 0 отсутствуют.
  • Для теста вручную установите запас товара в 0 и обновите метаданные. Проверьте, что товар удалился автоматически.
  • Проверьте в базе данных наличие постов с post_type = 'product' и meta_key = '_stock_status', равным 'outofstock'. Их не должно быть.

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

  • Товары не удаляются после установки запаса 0
    Проверьте, включено ли управление запасами глобально и для товара. Без этого поле _stock_status не обновляется.
  • Удаление происходит не сразу
    Если вы используете только cron-задачу, удаление произойдет в момент срабатывания cron (обычно раз в сутки). Чтобы ускорить, используйте хук на обновление мета-поля.
  • Удалённые товары можно восстановить
    Если хотите полностью удалить, используйте wp_delete_post($id, true), иначе товар попадёт в корзину.
  • Потеря данных о товаре
    Перед внедрением решения сделайте резервную копию базы данных.

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

  • Добавьте проверку прав пользователя и nonce, если реализуете удаление через AJAX или действия вручную.
  • Для больших магазинов с тысячами товаров используйте WP_Query с постраничной загрузкой (paged и posts_per_page), чтобы избежать превышения лимитов памяти.
  • Регулярно проверяйте логи ошибок и статус выполнения WP-Cron, чтобы убедиться в работе задачи.
  • Используйте плагин Clearfy Pro для удаления дублей и оптимизации базы данных после массового удаления товаров: https://wpshop.ru/plugins/clearfy?utm_source=wpaction.ru&utm_medium=article&utm_campaign=woocommerce-udalit-tovar-pri-otsutstvii-na-sklade

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

МетодПлюсыМинусы
Включить "Скрывать товары при отсутствии на складе"Простота настройки, без кодаТовар остается в базе и может отображаться в поиске
WP-Cron для массового удаленияАвтоматизация, удаление из базыУдаление происходит с задержкой, нагрузка при больших объемах
Хук на обновление мета-поляМгновенное удаление, точечноеПовышенная нагрузка на сайт при частых изменениях
Плагин для управления запасамиГотовое решение, поддержка и обновленияДополнительные расходы и возможные конфликты
Как создать собственный вид мета-блока в WordPress с примерами кода
13.03.2026
Как удалить неиспользуемые медиафайлы в WordPress
02.12.2025
Как отключить автоматические обновления в WordPress с помощью кода
04.03.2026
Как создать автоматические уведомления в WordPress с помощью WPRemark
17.02.2026
Оптимизация базы данных WordPress: как ускорить сайт и снизить нагрузку
14.11.2025