Как автоматически удалить неиспользуемые вариации товаров в WooCommerce

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

В крупных WooCommerce-магазинах после массового обновления товаров или изменения атрибутов часто остаются «мертвые» вариации — записи в базе, которые не используются в каталоге и не видны пользователю. Они занимают место, замедляют админку и усложняют управление товарами.

Чтобы проверить наличие таких вариаций, можно выполнить SQL-запрос в базе данных (через phpMyAdmin или wp-cli):

SELECT ID, post_title FROM wp_posts WHERE post_type = 'product_variation' AND post_parent NOT IN (SELECT ID FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish');

Этот запрос ищет вариации, у которых нет активного родительского товара. Если список не пуст, есть неиспользуемые вариации.

Почему важно удалять неиспользуемые вариации

  • Уменьшается размер базы данных и ускоряется выполнение запросов.
  • Админка WooCommerce работает быстрее без лишних записей.
  • Уменьшается риск конфликтов и ошибок при обновлении товаров.
  • Упрощается резервное копирование и восстановление.

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

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

Добавьте следующий код в файл functions.php вашей активной темы или в кастомный плагин:

function wpskill_remove_unused_variations() {
    global $wpdb;

    // Получаем ID вариаций, у которых нет опубликованных родительских товаров
    $query = "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->posts} parent ON p.post_parent = parent.ID
        WHERE p.post_type = 'product_variation'
          AND (parent.ID IS NULL OR parent.post_status != 'publish')";

    $variations_to_delete = $wpdb->get_col($query);

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

    foreach ($variations_to_delete as $variation_id) {
        wp_delete_post($variation_id, true); // жесткое удаление
    }
}

2. Запуск функции по расписанию с помощью WP-Cron

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

if (!wp_next_scheduled('wpskill_cleanup_variations_daily')) {
    wp_schedule_event(time(), 'daily', 'wpskill_cleanup_variations_daily');
}
add_action('wpskill_cleanup_variations_daily', 'wpskill_remove_unused_variations');

3. Принудительный запуск для теста

Для проверки работы функции вызовите ее вручную в админке или через wp-cli:

wp eval 'wpskill_remove_unused_variations();'

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

Чтобы убедиться в удалении, повторите SQL-запрос из раздела диагностики. Если запрос не возвращает вариаций, значит функция работает корректно.

Также проверьте админку WooCommerce — количество вариаций должно уменьшиться, а интерфейс стал отзывчивей.

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

  • Ошибка: WP-Cron не срабатывает — причина в том, что WP-Cron срабатывает при посещении сайта. Если трафика мало, задача может не запуститься.
    Решение: настроить системный cron на выполнение wget -q -O - https://example.com/wp-cron.php?doing_wp_cron с нужной периодичностью.
  • Ошибка: удаляются нужные вариации — возможно, родительский товар временно черновик или приватный.
    Решение: уточнить критерии выборки и учитывать статусы private или draft в запросе, либо вручную исключать определённые товары.
  • Ошибка: функция вызывает ошибки памяти или времени выполнения.
    Решение: добавьте лимит выборки и запускайте удаление пакетами, например, по 50 вариаций за вызов.

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

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

Сравнение вариантов удаления вариаций

МетодПлюсыМинусы
Ручное удаление через админку Просто, без кода Долго, неэффективно при большом объёме
SQL-запросы в базе Быстро и массово Риск ошибок, требует опыта
Автоматизация через WP-Cron и PHP Автоматически поддерживает чистоту базы Необходима настройка, мониторинг
Как автоматически удалять неиспользуемые медиа файлы в WordPress
26.02.2026
Как добавить автоматическое обновление цен в WooCommerce при изменении атрибутов
24.04.2026
Автоматическое создание конкурсов в WordPress
21.03.2026
Автоматическое удаление оставленных корзин в WooCommerce с помощью WP-Cron
12.06.2026
Как сделать защиту от bruteforce в WordPress с помощью плагинов и кода
25.03.2026