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

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

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

Типичные признаки проблемы:

  • Долгая генерация страниц товаров с вариациями.
  • Высокая нагрузка на базу данных и медленные запросы к таблице wp_posts с типом product_variation.
  • Наличие большого количества вариаций без активности продаж или с пометкой «неактивно».

Как автоматически удалять вариации по условиям через PHP

Задача

Удалить из WooCommerce вариации товаров, которые не продавались более 6 месяцев и имеют статус «черновик» или «неактивный».

Пошаговое решение с кодом

Реализуем функцию, которая будет искать вариации по заданным критериям и удалять их программно. Для запуска используем WP-CLI или хук cron.

function wpmarket_delete_old_variations() {
    global $wpdb;
    // Получаем ID вариаций, которые не продавались более 180 дней и в статусе draft или pending
    $threshold_date = date('Y-m-d H:i:s', strtotime('-180 days'));

    $variations = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.ID
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id AND oim.meta_key = '_product_id'
        WHERE p.post_type = 'product_variation'
        AND p.post_status IN ('draft', 'pending')
        AND (p.post_date < %s)
        GROUP BY p.ID
        HAVING MAX(oim.meta_value) IS NULL",
        $threshold_date
    ));

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

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // Удаление без корзины
    }

    return count($variations);
}

// Пример запуска вручную
add_action('admin_init', function() {
    if (isset($_GET['delete_old_variations'])) {
        $deleted = wpmarket_delete_old_variations();
        echo 'Удалено вариаций: ' . $deleted;
        exit;
    }
});

Объяснение

  • Функция ищет вариации с типом product_variation и статусом draft или pending.
  • Отбираются вариации, у которых дата создания старше 180 дней.
  • Проверяется отсутствие продаж (через связь с заказами и мета-данными). Если продаж нет, вариация удаляется.
  • Удаление происходит без помещения в корзину (безвозвратно) для очистки базы.

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

  • Перейдите в админку WooCommerce > Товары > Вариации и убедитесь, что по условию удалены старые вариации.
  • Выполните запрос к базе, например, через phpMyAdmin или WP-CLI:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_date < NOW() - INTERVAL 180 DAY AND post_status IN ('draft', 'pending');
    Число должно уменьшиться после запуска скрипта.
  • Запустите скрипт с параметром ?delete_old_variations=1 в URL админки для однократного удаления.

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

  • Неправильный SQL-запрос: отсутствие корректного соединения таблиц заказов и мета-данных может привести к неверному определению вариаций без продаж. Проверьте таблицы woocommerce_order_items и woocommerce_order_itemmeta.
  • Удаление нужных вариаций: если условия заданы некорректно, можно удалить активные вариации. Рекомендуется сначала вывести список ID, а не удалять, и проверить вручную.
  • Отсутствие прав: функция должна запускаться с правами администратора, иначе wp_delete_post вернет ошибку.
  • Кеширование: если используется объектный кеш или плагины кеширования, после удаления вариаций может отображаться устаревшая информация. Очистите кеш после выполнения.

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

  • Запускайте удаление в ночное время или через WP-CLI для снижения нагрузки на сайт.
  • Перед массовым удалением сделайте полный бэкап базы данных.
  • Используйте транзакции базы данных, если планируете расширять логику, чтобы избежать частичных удалений.
  • Оптимизируйте таблицы после удаления: OPTIMIZE TABLE wp_posts;
  • Для удобства автоматизации интегрируйте функцию в WP-Cron с ограничением по времени и количеству удалений за раз.

Сравнение способов удаления вариаций: плагин vs код

МетодПреимуществаНедостатки
Плагин (например, Bulk Delete)Удобный интерфейс, не требует кода, можно настроить фильтрыМенее гибкий, может не учитывать все условия, дополнительная нагрузка
Собственный PHP-скриптПолный контроль, можно настроить точные условия, автоматизация через cronТребует навыков программирования, риск ошибок без тестирования

Чек-лист для внедрения автоматического удаления вариаций

  • Определить критерии удаления (статус, дата, продажи)
  • Написать и протестировать функцию удаления на тестовом сайте
  • Проверить права пользователя для выполнения удаления
  • Запустить функцию через WP-CLI или cron-задание
  • Очистить кеш сайта и проверить результат
  • Сделать бэкапы перед запуском на живом сайте
Как создать настройку с AJAX в плагине WordPress
29.12.2025
Как добавить автоматическое удаление товаров WooCommerce по старым датам
10.05.2026
Как автоматически удалить вариации товаров WooCommerce по заданным условиям
26.05.2026
Как создать собственный виджет для WordPress
26.11.2025
Как создать автоматический импорт отзывов в WordPress с помощью плагинов
04.03.2026