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

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

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

Проблема особенно актуальна при большом ассортименте и частом обновлении остатков. Ручное удаление неэффективно и подвержено ошибкам.

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

Обязательные условия для реализации

  • Включён учёт остатков (Stock Management) в настройках WooCommerce.
  • Для вариативных товаров проверка должна учитывать все вариации.
  • Бэкап базы данных перед массовым удалением.

Пошаговое решение с примером кода

Добавим в файл functions.php вашей темы (или в собственный плагин) следующий код для удаления товаров без наличия раз в сутки по крону:

function wps_delete_out_of_stock_products() {
    if ( ! class_exists('WC_Product_Query') ) {
        return;
    }

    $args = array(
        'limit' => -1,
        'status' => 'publish',
        'stock_status' => 'outofstock',
        'return' => 'ids',
    );

    $query = new WC_Product_Query($args);
    $product_ids = $query->get_products();

    if (empty($product_ids)) {
        return;
    }

    foreach ($product_ids as $product_id) {
        wp_delete_post($product_id, true); // true - безвозвратно
    }
}

// Регистрируем cron событие, если оно ещё не зарегистрировано
if ( ! wp_next_scheduled( 'wps_daily_delete_out_of_stock' ) ) {
    wp_schedule_event( time(), 'daily', 'wps_daily_delete_out_of_stock' );
}

// Привязываем функцию к событию
add_action('wps_daily_delete_out_of_stock', 'wps_delete_out_of_stock_products');

Этот код использует класс WC_Product_Query для выборки всех опубликованных товаров со статусом outofstock и удаляет их безвозвратно.

Особенности работы с вариативными товарами

WooCommerce по умолчанию считает вариативный товар «в наличии», если хотя бы одна вариация есть в наличии. Для удаления вариативных товаров, у которых все вариации отсутствуют, нужен дополнительный код:

function wps_delete_out_of_stock_variable_products() {
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post_status' => 'publish',
        'tax_query' => array(
            array(
                'taxonomy' => 'product_type',
                'field' => 'slug',
                'terms' => 'variable',
            ),
        ),
        'fields' => 'ids',
    );

    $variable_products = get_posts($args);

    foreach ($variable_products as $product_id) {
        $product = wc_get_product($product_id);
        $variations = $product->get_children();

        $all_out_of_stock = true;
        foreach ($variations as $variation_id) {
            $variation = wc_get_product($variation_id);
            if ($variation->is_in_stock()) {
                $all_out_of_stock = false;
                break;
            }
        }

        if ($all_out_of_stock) {
            wp_delete_post($product_id, true);
        }
    }
}

add_action('wps_daily_delete_out_of_stock', 'wps_delete_out_of_stock_variable_products');

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

  • Вручную проверьте, что в каталоге не осталось товаров без остатков (через админку или SQL-запрос).
  • Принудительно запустите событие cron для теста, например, через плагин WP Crontrol.
  • Проверьте логи ошибок и убедитесь, что удаление прошло без сбоев.
  • Убедитесь, что в корзине и на фронтенде не показываются удалённые товары.

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

  • Не удаляются вариативные товары: не учтён статус всех вариаций. Используйте второй код из статьи.
  • Удаление не происходит: cron событие не активировано, проверьте wp_schedule_event и работу WP Cron.
  • Удаляются товары в наличии: ошибка в логике или неверный параметр stock_status. Проверяйте статус через админку и код.
  • Потеря данных без восстановления: всегда делайте бэкап базы перед массовыми операциями.

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

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

Сравнение вариантов реализации

МетодПлюсыМинусыКомпромиссы
Плагин (например, WP All Import Pro с функцией удаления)Простой интерфейс, поддержка, дополнительные функцииПлатно, нагрузка, лишний функционалПодходит для крупных магазинов с бюджетом
Код в functions.php (как в статье)Бесплатно, точечное решение, гибкостьТребует навыков, возможны ошибкиДля опытных разработчиков и контролируемых условий
Внешние скрипты SQL + WP CLIМаксимальная скорость и контрольРиск повреждения базы, требует навыков SQLДля продвинутых администраторов с бэкапами
WooCommerce: как использовать хук для изменения количества товаров в корзине
29.05.2026
Автоматизация управления пользовательскими ролями в WordPress
21.03.2026
Как удалить пустые таксономии и термины в WordPress
28.03.2026
WooCommerce: как использовать хуки для динамических изменений структуры страницы товара
26.05.2026
WooCommerce: как автоматически удалять товары без наличия на складе
09.06.2026