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

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

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

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

  • Товары с остатком 0 (stock_quantity <= 0) и отключенным управлением запасами (manage_stock = true)
  • Простые товары без атрибутов и вариаций (simple products без атрибутов)
  • Вариации товаров с нулевым остатком и без назначенных атрибутов

Автоматическое удаление следует настроить с учётом статусов заказа — не удалять товары, связанные с активными заказами.

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

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

add_action('wp', 'setup_daily_product_cleanup_cron');
function setup_daily_product_cleanup_cron() {
    if (!wp_next_scheduled('daily_product_cleanup_event')) {
        wp_schedule_event(time(), 'daily', 'daily_product_cleanup_event');
    }
}

2. Обработчик очистки товаров

add_action('daily_product_cleanup_event', 'delete_low_stock_and_attribute_less_products');
function delete_low_stock_and_attribute_less_products() {
    $args = [
        'post_type'      => ['product', 'product_variation'],
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ],
            [
                'key'     => '_manage_stock',
                'value'   => 'yes',
            ],
        ],
        'fields'         => 'ids',
    ];

    $products = get_posts($args);

    foreach ($products as $product_id) {
        $product = wc_get_product($product_id);

        // Проверка на атрибуты для простых товаров
        if ($product->is_type('simple')) {
            $attributes = $product->get_attributes();
            if (empty($attributes)) {
                wp_delete_post($product_id, true); // Удаляем без возможности восстановления
            }
        } elseif ($product->is_type('variable')) {
            // Удаление вариаций без атрибутов и с нулевым остатком
            $variations = $product->get_children();
            foreach ($variations as $variation_id) {
                $variation = wc_get_product($variation_id);
                if ($variation->get_stock_quantity() <= 0) {
                    $variation_attributes = $variation->get_attributes();
                    if (empty($variation_attributes)) {
                        wp_delete_post($variation_id, true);
                    }
                }
            }
        }
    }
}

Как проверить, что функция работает

  • Включите отладку: добавьте error_log с выводом количества удалённых товаров внутрь функции.
  • Запустите cron вручную через wp-cli: wp cron event run daily_product_cleanup_event.
  • Проверьте базу данных — удалённые товары должны исчезнуть из таблицы wp_posts.
  • Проверьте фронтенд — товары с нулевым остатком и без атрибутов не должны отображаться.

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

  • Удаление нужных товаров: функция не учитывает связанные заказы — добавьте проверку, что товар не используется в активных заказах (wc_get_orders с фильтром по продуктам).
  • Удаление не срабатывает: убедитесь, что cron запускается (используйте плагин WP Crontrol для диагностики).
  • Удаление вариаций не происходит: проверьте, что в запросе указаны оба типа post_type: product и product_variation.
  • Потеря данных при удалении: используйте wp_delete_post с параметром true для полного удаления, иначе товар попадёт в корзину.

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

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

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПолный контроль, простотаНеэффективно для больших магазиновМалые магазины или разовые операции
Плагины очистки (например, WP Sweep, Clearfy Pro)Автоматизация, дополнительные функцииЗависимость от стороннего кода, возможные конфликтыСредние магазины, дополнительная оптимизация
Кастомный WP-Cron скрипт (как в статье)Полный контроль, гибкость, интеграция с бизнес-логикойТребует навыков программирования, ответственность за тестированиеКрупные проекты с уникальными требованиями
WooCommerce: Автоматическое удаление неактивных заказов по дате
19.05.2026
Автоматизация создания резервных копий в WordPress: плагины и кодовые решения
14.01.2026
Как удалить пользовательский аккаунт со всеми данными в WordPress
19.02.2026
Как удалить сообщения об ошибках в WordPress без плагинов
20.03.2026
Как удалить или изменить URL страницы в WordPress без перенаправления
19.01.2026