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

Диагностика проблемы с нулевым остатком в WooCommerce

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

Для начала нужно проверить, как WooCommerce обрабатывает остатки. В настройках WooCommerce в разделе "Товары > Запасы" активирована ли опция "Включить управление запасами" и стоит ли галочка на "Скрывать товары с нулевым остатком"?

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

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

1. Удаление товаров с нулевым остатком

Добавим код, который будет автоматически удалять товары с общим остатком 0. Для этого используем хук woocommerce_scheduled_delete или создадим собственный Cron-задачу.

function wpb_delete_out_of_stock_products() {
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'outofstock',
            ),
        ),
        'fields' => 'ids',
    );

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

if (!wp_next_scheduled('wpb_delete_out_of_stock_products_hook')) {
    wp_schedule_event(time(), 'daily', 'wpb_delete_out_of_stock_products_hook');
}
add_action('wpb_delete_out_of_stock_products_hook', 'wpb_delete_out_of_stock_products');

2. Автоматическое удаление вариантов с нулевым остатком

Варианты товаров (вариации) нужно проверять отдельно, так как у них есть собственные мета-поля запасов. Мы можем удалить вариации, если их запас равен 0.

function wpb_delete_out_of_stock_variations() {
    $args = array(
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => '_stock_status',
                'value' => 'outofstock',
            ),
        ),
        'fields' => 'ids',
    );

    $variations = get_posts($args);
    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true);
        }
    }
}

if (!wp_next_scheduled('wpb_delete_out_of_stock_variations_hook')) {
    wp_schedule_event(time(), 'daily', 'wpb_delete_out_of_stock_variations_hook');
}
add_action('wpb_delete_out_of_stock_variations_hook', 'wpb_delete_out_of_stock_variations');

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

  • Убедитесь, что Cron-задачи запланированы в разделе «Инструменты > Запланированные задания» (с помощью плагина WP Crontrol).
  • Проверьте, что после выполнения Cron-заданий товары и варианты с нулевым запасом удаляются из базы (в админке WooCommerce они больше не отображаются).
  • Откройте сайт в режиме гостя и проверьте, что товары с нулевым остатком не видны в каталоге и не добавляются в корзину.
  • Для теста можно вручную вызвать функцию из консоли или временно добавить вызов в шаблон (только для отладки).

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

  • Отсутствие Cron-задач: если Cron не срабатывает, проверьте, включён ли WP Cron на сервере. Для надежности настроить системный Cron на запуск wp-cron.php.
  • Удаление не происходит из-за прав: убедитесь, что у пользователя, под которым запускается скрипт, есть права на удаление постов.
  • Вариации не удаляются: проверьте, что у вариаций правильно выставлен _stock_status и что параметр post_type указан как product_variation.
  • Удаленные товары появляются снова: возможно, сторонний плагин восстанавливает или синхронизирует товары. Проверьте интеграции.

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

  • Вместо полного удаления постов можно сначала переводить их в черновики или скрывать, чтобы иметь возможность откатить изменения.
  • Запускать удаление не чаще одного раза в день, чтобы избежать перегрузки сервера.
  • Перед массовым удалением делайте резервную копию базы данных.
  • Используйте WP Crontrol для мониторинга и управления Cron-задачами.
  • Для сложных магазинов с большим количеством товаров рассмотрите использование плагинов оптимизации и очистки, например Clearfy Pro, который помогает управлять базой и ускорять сайт.

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

МетодПреимуществаНедостатки
Автоматическое удаление через Cron и код Полный контроль, нет дополнительных плагинов, можно кастомизировать Требует навыков программирования, возможна нагрузка при большом количестве товаров
Плагины для очистки и оптимизации (например, Clearfy) Простота настройки, дополнительные функции оптимизации Могут быть платными, нагрузка зависит от плагина, меньше гибкости
Ручное удаление через админку WooCommerce Минимум риска, полный контроль за каждым товаром Непрактично при большом количестве товаров, требует времени
Автоматическое удаление неактивных пользователей WordPress с помощью кода
27.03.2026
WooCommerce: автоматическое удаление отменённых заказов и диагностика проблем
06.07.2026
Удаление неиспользуемых метаданных в WordPress для оптимизации базы данных
17.11.2025
Как создать автоматическое удаление старого контента в WordPress
23.12.2025
Как отключить Jetpack в WordPress по условиям: практические способы и примеры кода
26.01.2026