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

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

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

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

Как проверить отсутствие заказов по вариации

Выполните SQL-запрос в базе WooCommerce для поиска ID вариаций без заказов:

SELECT p.ID FROM wp_posts p WHERE p.post_type = 'product_variation' AND NOT EXISTS (SELECT 1 FROM wp_woocommerce_order_items oi JOIN wp_woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id WHERE oi.order_item_type = 'line_item' AND oim.meta_key = '_variation_id' AND oim.meta_value = p.ID);

Этот запрос возвращает ID вариаций товаров, которые никогда не были куплены.

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

Для автоматизации удаления неактивных вариаций создадим кастомный скрипт, который будет запускаться по cron или вручную:

  1. Определяем критерии удаления: вариации, которые неактивны (статус «draft» или «private») и не имеют заказов за последний год.
  2. Создаем функцию для сбора таких вариаций и удаления их через WooCommerce API.
function wc_delete_inactive_variations( $days_inactive = 365 ) {
    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );

    // Получаем ID вариаций, неактивных и без заказов после $date_threshold
    $variations = $wpdb->get_col( $wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         WHERE p.post_type = 'product_variation'
           AND p.post_status IN ('draft', 'private')
           AND p.post_date < %s
           AND NOT EXISTS (
               SELECT 1 FROM {$wpdb->prefix}woocommerce_order_items oi
               JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
               JOIN {$wpdb->posts} o ON o.ID = oi.order_id
               WHERE oi.order_item_type = 'line_item'
                 AND oim.meta_key = '_variation_id'
                 AND oim.meta_value = p.ID
                 AND o.post_status IN ('wc-completed', 'wc-processing')
                 AND o.post_date > %s
            )",
            $date_threshold,
            $date_threshold
    ) );

    if ( empty( $variations ) ) {
        return 'No inactive variations found for deletion.';
    }

    foreach ( $variations as $variation_id ) {
        wp_delete_post( $variation_id, true );
    }

    return count( $variations ) . ' inactive variations deleted.';
}

Вы можете запустить эту функцию вручную или добавить вызов в cron:

// Пример вызова
add_action('init', function() {
    if ( current_user_can('administrator') && isset($_GET['delete_inactive_variations']) ) {
        echo wc_delete_inactive_variations();
        exit;
    }
});

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

  • Запустите функцию вручную через URL, например: https://your-site.ru/?delete_inactive_variations=1. В ответе должно быть количество удалённых вариаций.
  • Проверьте в админке WooCommerce, что неактивные вариации удалены.
  • Сделайте тестовую покупку вариации и проверьте, что она не удаляется при повторном запуске.

Частые ошибки при автоматическом удалении вариаций и их исправление

  • Удаление активных вариаций: Проверьте правильность фильтра по статусу и дате, чтобы случайно не удалить продающиеся варианты.
  • Отсутствие прав на удаление: Убедитесь, что код запускается с правами администратора и wp_delete_post вызывается корректно.
  • Неучет заказов: Если отчет по заказам неполный, проверьте корректность SQL-запроса и статусов заказов.
  • Проблемы с производительностью: При большом количестве вариаций разбейте удаление на партии (batch processing) с лимитом на количество удаляемых вариаций за один запуск.

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

  • Всегда создавайте резервную копию базы перед массовым удалением данных.
  • Ограничьте запуск скрипта только для авторизованных администраторов и по защищённым триггерам (cron, секретный ключ в URL).
  • Используйте WP-Cron с интервалом один раз в неделю для автоматизации без нагрузки на сервер.
  • Для больших магазинов внедрите batch-обработку с лимитом, например 50 вариаций за раз.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростота, контрольДолго, неудобно при большом каталоге
Плагины (например, Bulk Delete)Автоматизация, UIМогут быть платными, лишний функционал
Код на PHP (как в статье)Максимальный контроль, автоматизация, легковесностьТребует навыков разработки, риск ошибок без тестов
Автоматическая замена изображений при импорте в WordPress
16.02.2026
Автоматическое удаление старых терминов в WordPress
23.03.2026
Как добавить дополнительное поле в форму регистрации WordPress с сохранением и валидацией
11.12.2025
WooCommerce: автоматическое удаление неактивных вариаций товаров с помощью кода
20.05.2026
Как создать автоматические резервные копии WordPress
29.11.2025