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

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

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

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

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

  • Вариация не отображается в каталоге и не может быть выбрана на странице товара.
  • У вариации нет продаж или просмотренных записей за длительное время.
  • Она не связана с активными атрибутами товара.

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

Рассмотрим пример кода, который удаляет вариации без продаж и без последних просмотров за последние 6 месяцев. Скрипт можно запускать вручную или через WP-Cron.

function wpturbo_remove_unused_variations() {
    global $wpdb;

    // Получаем ID вариаций, у которых нет заказов и которые не обновлялись более 180 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    $query = $wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id IN (
            SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta
            WHERE meta_key = '_variation_id' AND meta_value = p.ID
        )
        WHERE p.post_type = 'product_variation'
        AND oi.order_item_id IS NULL
        AND p.post_modified < %s",
        $date_threshold
    );

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

    if (empty($variation_ids)) {
        error_log('No unused variations found for removal.');
        return;
    }

    foreach ($variation_ids as $variation_id) {
        wp_delete_post($variation_id, true); // принудительное удаление
        error_log("Deleted unused variation ID: $variation_id");
    }
}

// Для запуска вручную раскомментируйте
// wpturbo_remove_unused_variations();

// Для автоматизации через WP-Cron (один раз в неделю)
add_action('wpturbo_weekly_cleanup', 'wpturbo_remove_unused_variations');

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

Объяснение кода

  • Запрос ищет вариации без связанных заказов (через meta_key '_variation_id').
  • Отбираются вариации, не обновлявшиеся более 180 дней (параметр можно менять).
  • Удаление происходит с принудительным удалением из базы (без перемещения в корзину).
  • Скрипт можно запускать вручную или назначить регулярный запуск через WP-Cron.

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

Чтобы убедиться, что решение работает, выполните следующие шаги:

  1. Запустите функцию wpturbo_remove_unused_variations(); вручную, например, через подключенный сниппет или в консоли WP-CLI.
  2. Проверьте логи ошибок (error_log) на предмет сообщений об удалении вариаций.
  3. В админке WooCommerce проверьте, что неиспользуемые вариации исчезли.
  4. Сделайте резервную копию базы перед запуском и после сравните количество вариаций в таблице wp_posts с типом product_variation.

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

  • Удаляются нужные вариации: Проверьте правильность условия в SQL-запросе, особенно дату и отсутствие заказов. Можно усложнить логику, добавив проверку активности атрибутов.
  • Скрипт не запускается через WP-Cron: Убедитесь, что WP-Cron активен и работает (например, посетители сайта вызывают cron-задания) или используйте системный cron для вызова wp-cron.php.
  • Высокая нагрузка при выполнении: Если вариаций много, разбейте запрос на части, например, по 50 записей за раз, чтобы не было таймаутов.

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

  • Бэкап базы данных: Перед массовым удалением делайте резервную копию.
  • Логирование: Ведите лог удалений, чтобы отслеживать изменения.
  • Проверка условий: Тестируйте скрипт на тестовом стенде перед продакшеном.
  • Используйте WP-CLI: Для больших магазинов запуск через WP-CLI сократит нагрузку и ускорит процесс.
  • Оптимизируйте запросы: Индексы по метаданным WooCommerce помогут ускорить выборку.

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

МетодПлюсыМинусы
Удаление вручную через админку WooCommerce Просто, без навыков кода Долго, неудобно при большом количестве вариаций
Плагины для очистки вариаций Автоматизация, GUI Могут быть платными, влияют на производительность
Код на PHP с WP-Cron (описанный в статье) Гибкость, автоматизация, контроль Требует навыков, возможны ошибки без тестирования
Как удалить заблокированных пользователей в WordPress
05.03.2026
Удаление неиспользуемых вариаций товаров в WooCommerce без плагинов
09.05.2026
WooCommerce: установка и настройка отслеживания заказов в режиме реального времени
27.04.2026
Как установить лимит на количество постов в рассылке WordPress
12.04.2026
Логика оценки продуктивности в WordPress: практическое руководство с примерами
31.12.2025