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

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

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

Как определить, какие варианты считать неактивными

Для автоматической очистки нужно чётко понимать критерии неактивности. Обычно это:

  • отсутствие остатков в запасах (stock_quantity = 0)
  • статус варианта — «черновик» или «скрыт» (post_status)
  • отсутствие продаж за последний период (опционально, требует дополнительного анализа заказов)

В нашем примере возьмём первый и второй критерии, как самые простые для реализации.

Пошаговое решение: создание WP-Cron задачи для удаления неактивных вариантов

Для автоматизации используем встроенный WP-Cron, который запускает функцию по расписанию. В ней мы находим все вариации с нулевым остатком или статусом «черновик» и удаляем их.

1. Регистрация пользовательского расписания

add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['daily'])) {
        $schedules['daily'] = [
            'interval' => 86400,
            'display' => __('Once Daily')
        ];
    }
    return $schedules;
});

Используем стандартный интервал «daily» (раз в день).

2. Планирование задачи при активации плагина или темы

register_activation_hook(__FILE__, function() {
    if (!wp_next_scheduled('wpb_delete_inactive_variations')) {
        wp_schedule_event(time(), 'daily', 'wpb_delete_inactive_variations');
    }
});

register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wpb_delete_inactive_variations');
});

3. Реализация функции удаления вариантов

add_action('wpb_delete_inactive_variations', function() {
    // Запрос вариантов с нулевым остатком или статусом 'draft'
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['publish', 'draft'],
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '='
            ]
        ]
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $variation) {
            // Проверяем статус
            if ($variation->post_status === 'draft' || get_post_meta($variation->ID, '_stock_status', true) === 'outofstock') {
                wp_delete_post($variation->ID, true); // Безвозвратно удаляем
            }
        }
    }
    wp_reset_postdata();
});

Проверка результата

  • Перейдите в раздел «Товары — Вариации» в админке WooCommerce и убедитесь, что неактивные варианты удалены.
  • Проверьте наличие запланированной задачи в WP-Cron с помощью плагина Cron Manager или аналогичного.
  • Для теста можно уменьшить интервал запуска WP-Cron на несколько минут и вручную запустить событие в Cron Manager.

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

  • Задача WP-Cron не запускается: проверьте, что на сайте посещения, которые запускают WP-Cron, или настройте системный cron для вызова wp-cron.php.
  • Вариации не удаляются: убедитесь, что запрос WP_Query корректно находит варианты с нужным статусом и мета-данными. Используйте error_log или var_dump для отладки.
  • Удаляются лишние варианты: уточните критерии отбора в meta_query и post_status.
  • Нарушение целостности данных: перед удалением создайте резервную копию базы, чтобы избежать потерь.

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

  • Удаляйте записи с помощью функции wp_delete_post с параметром true, чтобы не оставлять мусор в базе.
  • При большом количестве вариаций разбивайте удаление на порции, чтобы не перегрузить сервер.
  • Используйте транзакции базы данных или проверяйте связи вариаций с родительскими товарами.
  • Ограничьте права пользователя, под которым запускается WP-Cron, чтобы избежать случайных удалений.

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

МетодПлюсыМинусы
WP-Cron с пользовательским кодомГибкость, бесплатно, без сторонних плагиновЗависит от посещаемости сайта, требуется тестирование
Плагины очистки WooCommerceПростота настройки, готовые функцииМожет нагружать сайт, не всегда гибко
Ручная очистка через SQL-запросыБыстро и эффективно при больших объемахРиск ошибок, требует навыков SQL
WooCommerce: автоматическое изменение стоимости товаров по расписанию без плагинов
06.06.2026
WooCommerce: как найти и исправить дублирующиеся артикулы (SKU) в продуктах
04.05.2026
Как создать динамические таблицы в WordPress с помощью шорткодов
26.12.2025
Оптимизация загрузки WordPress плагинов: уменьшение времени отклика и повышение скорости сайта
03.11.2025
Как добавить поле с вариантами в вывод товара WooCommerce для удобства выбора
07.01.2026