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

Что такое неактивные вариации товаров в WooCommerce и почему их нужно удалять

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

Диагностика: как определить неактивные вариации

Для начала нужно понять, какие вариации считать неактивными. Чаще всего это вариации с:

  • статусом private или draft;
  • отсутствующим или нулевым остатком на складе;
  • датой последнего изменения более определённого срока назад (например, 6 месяцев);
  • отключённым отображением в каталоге (visibilityhidden).

Для выявления таких вариаций можно использовать SQL-запросы к базе или WP_Query с фильтрами.

Пример SQL-запроса для выявления неактивных вариаций

SELECT p.ID, p.post_title, pm1.meta_value AS stock_status, pm2.meta_value AS visibility
FROM wp_posts p
LEFT JOIN wp_postmeta pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_stock_status'
LEFT JOIN wp_postmeta pm2 ON p.ID = pm2.post_id AND pm2.meta_key = '_visibility'
WHERE p.post_type = 'product_variation'
AND (p.post_status = 'private' OR p.post_status = 'draft')
OR pm1.meta_value = 'outofstock'
OR pm2.meta_value = 'hidden';

Проверка через WP_Query

$args = [
    'post_type' => 'product_variation',
    'post_status' => ['private', 'draft'],
    'meta_query' => [
        'relation' => 'OR',
        [
            'key' => '_stock_status',
            'value' => 'outofstock',
            'compare' => '=',
        ],
        [
            'key' => '_visibility',
            'value' => 'hidden',
            'compare' => '=',
        ],
    ],
    'posts_per_page' => -1,
];
$query = new WP_Query($args);
$inactive_variations = $query->posts;

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

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

1. Функция удаления неактивных вариаций

function wpcore_delete_inactive_variations() {
    $args = [
        'post_type' => 'product_variation',
        'post_status' => ['private', 'draft'],
        'meta_query' => [
            'relation' => 'OR',
            [
                'key' => '_stock_status',
                'value' => 'outofstock',
                'compare' => '=',
            ],
            [
                'key' => '_visibility',
                'value' => 'hidden',
                'compare' => '=',
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $query = new WP_Query($args);
    if (empty($query->posts)) {
        error_log('No inactive variations found for deletion.');
        return;
    }

    foreach ($query->posts as $variation_id) {
        wp_delete_post($variation_id, true); // Удаляем без возможности восстановления
        error_log('Deleted variation ID: ' . $variation_id);
    }
}

2. Запуск функции через WP-Cron

Добавьте задание, которое будет запускаться, например, раз в неделю.

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

add_action('wpcore_weekly_delete_variations', 'wpcore_delete_inactive_variations');

3. Ручной запуск (для тестирования)

add_action('admin_init', function() {
    if (current_user_can('manage_options') && isset($_GET['run_delete_variations'])) {
        wpcore_delete_inactive_variations();
        echo 'Удаление неактивных вариаций выполнено';
        exit;
    }
});

После добавления этого кода в functions.php или в свой плагин, перейдите по ссылке https://ваш-сайт.ru/wp-admin/?run_delete_variations=1 для тестового запуска.

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

  • Проверьте логи ошибок (error_log), если добавляли логирование.
  • С помощью phpMyAdmin или аналогичного инструмента выполните SQL-запрос для проверки отсутствия вариаций с нужными статусами.
  • В административной панели WooCommerce проверьте список вариаций — неактивные должны исчезнуть.
  • Для контроля можно вывести количество вариаций до и после запуска функции.

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

  • Функция не срабатывает при запуске через WP-Cron: Проверьте, что WP-Cron включён (define('DISABLE_WP_CRON', false)) и что запланированное событие действительно добавлено (wp_get_scheduled_event).
  • Удаляются не те вариации: Проверьте условия post_status и meta_query. Возможно, нужно добавить дополнительные фильтры, например, по дате последнего обновления.
  • Удаление не происходит из-за прав доступа: Функция wp_delete_post требует прав администратора. Убедитесь, что скрипт запускается с нужными правами.
  • Потеря важных данных: Обязательно сделайте резервную копию базы перед массовым удалением и протестируйте функцию на тестовом сайте.

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

  • Используйте wp_delete_post($id, true) для полного удаления без помещения в корзину.
  • Если вариаций очень много, разбивайте удаление на чанки (например, по 50 штук за один запуск), чтобы избежать превышения времени выполнения.
  • Добавьте записи в лог для анализа работы функции и быстрого выявления ошибок.
  • Для мониторинга используйте плагины, например, Query Monitor, чтобы контролировать нагрузку на базу при массовом удалении.

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

МетодПлюсыМинусыПример использования
Ручное удаление в админкеПростота, контроль каждого вариантаДолго, неудобно при большом количествеУдаление вариаций через товар в WooCommerce
SQL-запросы напрямую в базеБыстрота, массовое удалениеРиск ошибок, потеря данных, нет проверки правDELETE FROM wp_posts WHERE post_type = 'product_variation' AND post_status='draft'
Автоматизация через WP-Cron и PHPГибкость, автоматический контроль, безопасностьТребует навыков программированияФункция wpcore_delete_inactive_variations()
WooCommerce: как автоматически удалять отменённые и завершённые заказы по дате без плагинов
09.05.2026
Автоматический импорт данных из YML в WordPress: практическое руководство
27.01.2026
Оптимизация базы данных WordPress: эффективные методы и примеры кода
15.11.2025
Как быстро удалить пустые термины в WordPress
04.02.2026
WooCommerce: автоматическое удаление неактивных заказов по дате
20.04.2026