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

Проблема: накопление неактивных вариантов товаров в WooCommerce

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

Неактивный вариант — это вариация товара, у которой статус «черновик» или «отключен» (по типу отсутствия на складе без возможности заказа). WooCommerce не удаляет такие варианты автоматически, поэтому требуется создать механизм их удаления.

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

Для проверки наличия неактивных вариантов используйте SQL-запрос в phpMyAdmin или через wpdb:

SELECT COUNT(*) as cnt FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation'
AND (p.post_status = 'draft' OR pm.meta_key = '_stock_status' AND pm.meta_value = 'outofstock');

Этот запрос покажет, сколько вариаций в статусе «черновик» или с отсутствием на складе.

Также можно вручную проверить вкладку «Вариации» в редакторе товара и увидеть, сколько вариантов отображаются как отключенные или черновики.

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

1. Создаем функцию удаления неактивных вариаций

function delete_inactive_product_variations() {
    global $wpdb;
    // Получаем ID вариаций со статусом draft или outofstock
    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_stock_status'
         WHERE p.post_type = 'product_variation'
         AND (p.post_status = 'draft' OR pm.meta_value = 'outofstock')"
    );
    if (!empty($variations)) {
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true); // true - без перемещения в корзину
        }
    }
}

2. Регистрируем планировщик WP-Cron для еженедельного запуска

add_action('delete_inactive_variations_event', 'delete_inactive_product_variations');

if (!wp_next_scheduled('delete_inactive_variations_event')) {
    wp_schedule_event(time(), 'weekly', 'delete_inactive_variations_event');
}

3. Добавляем отмену задания при деактивации плагина или темы

function clear_delete_inactive_variations_schedule() {
    $timestamp = wp_next_scheduled('delete_inactive_variations_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'delete_inactive_variations_event');
    }
}
register_deactivation_hook(__FILE__, 'clear_delete_inactive_variations_schedule');

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

  • Перейдите в базу данных и выполните SQL-запрос из раздела диагностики, количество неактивных вариантов должно уменьшиться или стать равно нулю после запуска cron.
  • Проверьте в админке WooCommerce — вкладку «Вариации» у товаров, неактивных вариантов не должно быть.
  • Для ручного запуска функции можно временно добавить вызов delete_inactive_product_variations(); в functions.php и проверить результат.

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

  • Функция не запускается по расписанию: проверьте, что WP-Cron работает. Для этого посетите сайт и убедитесь, что cron-задания не отключены в wp-config.php (нет define('DISABLE_WP_CRON', true);).
  • Удаляются нужные вариации: убедитесь, что условие в запросе точно определяет неактивные варианты. Если у вас другие статусы или мета-ключи, подкорректируйте запрос.
  • Ошибка прав доступа: функция wp_delete_post требует прав администратора или правильного контекста. Запускать лучше в админской части или через cron.
  • Большое количество вариантов вызывает таймаут: разбейте удаление на части, например, удалять по 50 вариантов за запуск.

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

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

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, без кодаТрудоемко, не автоматизировано
SQL-запрос на удалениеБыстрое массовое удалениеРиск ошибок, требует навыков работы с БД
Автоматическое удаление через WP-CronАвтоматизация, безопасно (через WP-функции)Нужна настройка, возможны таймауты при большом объеме
WordPress: как создать динамическое меню с подменю через код
08.01.2026
Как создать собственный виджет WordPress своими руками
20.11.2025
Как удалить ревизии постов в WordPress для очистки базы данных
11.12.2025
Как создать подписку на новости WordPress с помощью AJAX
15.12.2025
Автоматическое удаление неоплаченных заказов в WooCommerce
16.06.2026