Автоматическое удаление товаров из WooCommerce при нулевом остатке

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

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

Пользователи часто сталкиваются с необходимостью либо вручную отключать такие товары, либо искать плагины, которые не всегда подходят под их задачи. В этой статье мы рассмотрим, как настроить автоматическое удаление товаров с помощью кода, без сторонних плагинов.

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

1. Создание функции для проверки остатков и удаления товара

Для начала создадим функцию, которая будет запускаться при сохранении товара и проверять его складской запас. Если запас равен нулю, товар будет удаляться.

function wpcatalog_delete_product_if_out_of_stock( $post_id ) {
    // Проверяем, что это продукт WooCommerce
    if ( get_post_type( $post_id ) !== 'product' ) {
        return;
    }

    // Получаем объект товара
    $product = wc_get_product( $post_id );
    if ( ! $product ) {
        return;
    }

    // Проверяем, управляется ли складом
    if ( ! $product->managing_stock() ) {
        return;
    }

    // Получаем остаток на складе
    $stock_quantity = $product->get_stock_quantity();

    // Если остаток равен 0 или меньше, удаляем товар
    if ( $stock_quantity <= 0 ) {
        // Удаление товара без возможности восстановления
        wp_delete_post( $post_id, true );
    }
}
add_action( 'save_post', 'wpcatalog_delete_product_if_out_of_stock' );

2. Обработка вариативных товаров

Для вариативных товаров нужно проверять остаток каждой вариации. Если у всех вариаций запас 0, удаляем родительский товар.

function wpcatalog_delete_variable_product_if_all_variations_out_of_stock( $post_id ) {
    if ( get_post_type( $post_id ) !== 'product' ) {
        return;
    }

    $product = wc_get_product( $post_id );
    if ( ! $product || $product->get_type() !== 'variable' ) {
        return;
    }

    $variations = $product->get_children();
    $all_out_of_stock = true;

    foreach ( $variations as $variation_id ) {
        $variation = wc_get_product( $variation_id );
        if ( $variation && $variation->managing_stock() ) {
            if ( $variation->get_stock_quantity() > 0 ) {
                $all_out_of_stock = false;
                break;
            }
        } else {
            // Если вариация не управляет складом, считаем ее в наличии
            $all_out_of_stock = false;
            break;
        }
    }

    if ( $all_out_of_stock ) {
        wp_delete_post( $post_id, true );
    }
}
add_action( 'save_post', 'wpcatalog_delete_variable_product_if_all_variations_out_of_stock' );

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

  • Создайте или обновите товар с управлением складом и установите количество равным 0. После сохранения товар должен автоматически удалиться.
  • Для вариативного товара установите у всех вариаций запас 0 и сохраните родительский товар — он должен быть удалён.
  • Проверьте, что товары с положительным остатком не удаляются.
  • Для удобства можно добавить логирование или уведомления о удалении товаров.

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

  • Удаление не происходит после обновления товара. Проверьте, что функция подключена и хук save_post срабатывает. В админке включите WP_DEBUG и проверьте ошибки.
  • Удаляются товары без управления складом. Убедитесь, что проверка $product->managing_stock() реализована, чтобы не удалять товары без остатков.
  • Вариативные товары не удаляются при обнулении всех вариаций. Проверьте правильность цикла по вариациям и что передаются корректные ID.
  • Удаление товара приводит к потере данных. Если хотите временно скрывать товары, вместо удаления используйте смену статуса на 'trash' или 'private'.

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

  • Для избежания случайных удалений рекомендуем делать резервные копии базы данных перед внедрением такого кода.
  • Если на сайте много товаров, лучше запускать проверку в фоне через WP-Cron или отдельный скрипт, чтобы не замедлять сохранение товара.
  • Для логирования удалений можно использовать стандартные функции error_log или специальные плагины для аудита действий.
  • Если не хотите полностью удалять товар, замените wp_delete_post( $post_id, true ) на wp_trash_post( $post_id ) для перемещения в корзину.

Сравнение вариантов: код vs плагины

СпособПлюсыМинусыКомпромисс
Код (как в статье) Быстрое внедрение, нет нагрузки на сайт, полный контроль Требует навыков, риски при ошибке, нет интерфейса Добавить логирование и уведомления
Плагины для управления запасами Интерфейс, поддержка, дополнительные функции Может замедлить сайт, платные, не всегда гибкие Выбирать проверенные и легковесные
Добавление кастомных полей в WooCommerce без плагинов
19.01.2026
Как удалить повторяющиеся товары в WooCommerce без плагинов
24.05.2026
Как создать виджет из кратких записей WordPress
24.11.2025
WooCommerce: не работают кнопки «Купить» после обновления — как исправить
09.05.2026
Автоматический импорт товаров WooCommerce из Excel: практическое руководство
08.03.2026