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

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

В магазинах на WooCommerce часто накапливаются вариации товаров, которые по разным причинам становятся неактивными (disabled, out of stock, скрытыми). Это приводит к раздуванию базы данных, снижению производительности и путанице в админке. Как понять, что вариации неактивны?

  • В админке товара вариации не отображаются в каталоге, но остаются в базе.
  • В отчетах и статистике есть лишние записи с вариациями, которые вы давно не продаёте.
  • База данных растёт без видимой причины, особенно в таблицах wp_posts и wp_postmeta.

Для проверки можно выполнить SQL-запрос, который покажет количество вариаций с meta_key _stock_status и значением outofstock или hidden:

SELECT COUNT(*) FROM wp_postmeta pm
JOIN wp_posts p ON p.ID = pm.post_id
WHERE pm.meta_key = '_stock_status' AND pm.meta_value IN ('outofstock', 'hidden')
AND p.post_type = 'product_variation';

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

Реализуем функцию, которая будет запускаться по расписанию (cron) и удалять вариации товаров, которые:

  • Имеют статус «product_variation».
  • У которых в _stock_status указано outofstock или hidden.
  • Отсутствует активный заказ с этими вариациями.

Такой подход минимизирует риск удалить нужные варианты.

Код для удаления неактивных вариаций

function wpset_delete_inactive_variations() {
    global $wpdb;
    
    // Получаем ID вариаций с outofstock или hidden
    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
        JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
        WHERE p.post_type = 'product_variation'
        AND pm.meta_key = '_stock_status'
        AND pm.meta_value IN ('outofstock', 'hidden')"
    );

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

    foreach ($variations as $var_id) {
        // Проверяем, есть ли активные заказы с этой вариацией
        $orders = wc_get_orders(array(
            'limit' => 1,
            'status' => array('processing', 'completed', 'on-hold'),
            'meta_key' => '_product_id',
            'meta_value' => $var_id,
            'meta_compare' => '='
        ));

        if (empty($orders)) {
            // Удаляем вариацию
            wp_delete_post($var_id, true);
        }
    }
}

// Добавляем Cron событие при активации темы/плагина
function wpset_schedule_variation_cleanup() {
    if (!wp_next_scheduled('wpset_variation_cleanup_hook')) {
        wp_schedule_event(time(), 'daily', 'wpset_variation_cleanup_hook');
    }
}
add_action('wp', 'wpset_schedule_variation_cleanup');

// Хук для запуска функции
add_action('wpset_variation_cleanup_hook', 'wpset_delete_inactive_variations');

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

Для тестирования можно вызвать функцию напрямую в консоли WP-CLI или в файле functions.php:

wpset_delete_inactive_variations();

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

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

После запуска:

  • В админке уберите фильтр по статусам вариаций и убедитесь, что неактивные записи исчезли.
  • Повторите SQL-запрос из раздела диагностики — количество должно уменьшиться.
  • Проверьте логи ошибок и убедитесь, что удаление прошло без сбоев.

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

  • Удаляются нужные вариации: Проверьте фильтрацию заказов — функция ищет заказы с мета _product_id, что не всегда корректно. Лучше искать по _variation_id в метаполях заказов.
  • Функция не запускается по расписанию: Проверьте, активен ли WP-Cron, нет ли конфликтов с другими плагинами, используйте плагин WP Crontrol для диагностики.
  • Высокая нагрузка при удалении большого количества вариаций: Делайте удаление партиями, например по 20 штук за раз, с последующим отложенным вызовом через wp_schedule_single_event.

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

  • Перед автоматическим удалением обязательно создавайте резервные копии базы данных.
  • Ограничьте удаление вариаций по дате их последнего обновления — например, не удаляйте вариации, которые были обновлены в последние 30 дней.
  • Используйте WP-CLI для массового удаления, если база очень большая.
  • Внедрите логирование удалений в отдельный файл для контроля действий.

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

МетодОписаниеПлюсыМинусы
Удаление вручную через админку Удалять вариации по одной через интерфейс WooCommerce Безопасно, контроль на каждом шаге Очень долго, неудобно при большом количестве
Автоматический скрипт с WP-Cron Регулярное удаление неактивных вариаций с проверками Автоматизация, экономия времени Риск ошибок при недостаточной проверке, нагрузка на сервер
Плагины очистки базы Использование готовых решений типа Clearfy Pro Простота, дополнительные функции оптимизации Могут быть платными, риск конфликтов
Как удалить неактуальные transienty в WordPress и оптимизировать кэш
23.03.2026
Как удалить неиспользуемые таксономии в WordPress без плагинов
06.01.2026
Как создать автоматические уведомления в WordPress с помощью кода
11.04.2026
Как автоматически удалять старые записи в WordPress
03.04.2026
Как удалить заблокированные аккаунты пользователей в WordPress
02.01.2026