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

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

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

  • Отсутствие заказов с использованием вариации за определенный период (например, 6 месяцев).
  • Вариация отключена (статус "не опубликована" или "отключена").
  • Отсутствие остатков на складе.

Для диагностики можно использовать SQL-запросы к базе данных или отладочные плагины, например, Query Monitor, чтобы проверить активность вариаций.

Пример SQL-запроса для поиска вариаций без заказов за 6 месяцев:

SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
WHERE p.post_type = 'product_variation'
AND p.post_status = 'publish'
AND (oim.meta_key = '_product_id' OR oim.meta_key = '_variation_id')
AND oi.order_item_id IS NULL
AND p.post_date < NOW() - INTERVAL 6 MONTH;

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

Вместо ручного удаления выгодно настроить автоматический процесс, который будет регулярно очищать базу от неактивных вариаций. Для этого используем WP-Cron и PHP-код, который проверяет условия и удаляет вариации.

1. Регистрация планировщика задач WP-Cron

add_action('wp', function() {
    if (!wp_next_scheduled('wpg_delete_inactive_variations')) {
        wp_schedule_event(time(), 'daily', 'wpg_delete_inactive_variations');
    }
});

2. Основная функция удаления вариаций

add_action('wpg_delete_inactive_variations', function() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'date_query'     => [
            'before' => date('Y-m-d', strtotime('-6 months'))
        ]
    ];

    $variations = get_posts($args);

    foreach ($variations as $variation) {
        $variation_id = $variation->ID;
        $order_count = wpg_get_variation_order_count($variation_id);
        $stock = get_post_meta($variation_id, '_stock', true);

        if ($order_count == 0 && (!$stock || $stock == 0)) {
            wp_delete_post($variation_id, true);
        }
    }
});

function wpg_get_variation_order_count($variation_id) {
    global $wpdb;
    $count = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_order_itemmeta oim
         JOIN {$wpdb->prefix}woocommerce_order_items oi ON oim.order_item_id = oi.order_item_id
         JOIN {$wpdb->prefix}posts p ON oi.order_id = p.ID
         WHERE oim.meta_key = '_variation_id' AND oim.meta_value = %d
         AND p.post_status IN ('wc-completed', 'wc-processing')",
        $variation_id
    ));
    return intval($count);
}

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

После добавления кода выполните следующие проверки:

  • Подождите выполнение WP-Cron (можно запустить вручную через WP-CLI: wp cron event run wpg_delete_inactive_variations).
  • Проверьте в базе данных наличие вариаций, которые по условиям должны были быть удалены.
  • В интерфейсе WooCommerce убедитесь, что неактивные вариации исчезли.
  • Оцените производительность сайта и время загрузки страниц каталога.

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

  • Ошибка: WP-Cron не срабатывает.
    Причина: отсутствие посещений сайта или неправильная настройка сервера cron.
    Решение: настроить системный cron для вызова WP-Cron, например, через wget -q -O - https://your-site.ru/wp-cron.php?doing_wp_cron.
  • Ошибка: Удаляются нужные вариации.
    Причина: некорректные критерии выборки (например, неправильный период).
    Решение: внимательно проверить условие в date_query и функции подсчета заказов.
  • Ошибка: Падение сайта или ошибка памяти.
    Причина: выборка слишком большого количества вариаций за один запрос.
    Решение: разбить выборку на части, использовать пагинацию (например, по 100 штук), добавлять паузы.

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

  • Для удаления используйте wp_delete_post($id, true), чтобы удаление было полным, включая метаданные.
  • Проверяйте, чтобы статус заказа учитывался только «завершенные» и «в обработке», чтобы не удалять вариации с активными заказами.
  • Регулярно создавайте резервные копии базы перед автоматическими удалениями.
  • Добавьте логирование удалений в отдельный файл для аудита и восстановления при необходимости.
  • Для крупных магазинов используйте системный cron вместо WP-Cron для надежности.

Сравнение подходов: плагин vs код vs ручное удаление

МетодПреимуществаНедостатки
Плагин (например, WP Sweep)Простота установки, готовый функционалМожет не учитывать бизнес-логику, нагрузка на БД
Код с WP-Cron (как в статье)Гибкость, точное управление, без сторонних зависимостейТребует навыков программирования, настройка cron
Ручное удаление через админкуПолный контроль, нет риска автоматических ошибокЗатратно по времени, неудобно для больших каталогов
Как автоматически отправлять сообщения в Telegram из WordPress
09.03.2026
Как создать динамический виджет в WordPress с использованием REST API
15.12.2025
Как автоматически создавать контент на основе GPT в WordPress
07.01.2026
Хуки и фильтры WooCommerce: практическое руководство по автоматизации
30.04.2026
WooCommerce: автоматическое удаление неактивных пользователей по дате последнего заказа
29.05.2026