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

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

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

Как проверить наличие неактивных вариаций вручную

  • В админке WooCommerce откройте товар с вариациями.
  • Проверьте, есть ли вариации в статусе «отключено» или с нулевым запасом.
  • Выполните SQL-запрос в базе данных для поиска вариаций без активности:
    SELECT ID, post_parent, post_status FROM wp_posts WHERE post_type = 'product_variation' AND post_status != 'publish';

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

Для автоматического удаления неактивных вариаций можно использовать кастомный PHP-скрипт, который запускается по крону или вручную. Он будет искать вариации с определёнными условиями и удалять их.

Код для удаления вариаций с постстатусом 'draft' или 'private'

function wc_delete_inactive_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['draft', 'private', 'trash'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);
    if (empty($variations)) {
        return 'No inactive variations found.';
    }
    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true);
    }
    return count($variations) . ' inactive variations deleted.';
}

Для запуска функции можно использовать WP-CLI или добавить временный action в functions.php:

add_action('init', function() {
    if (isset($_GET['delete_inactive_variations']) && current_user_can('manage_woocommerce')) {
        echo wc_delete_inactive_variations();
        exit;
    }
});

После добавления кода вызовите URL https://ваш-сайт.ru/?delete_inactive_variations=1 под админом WooCommerce, чтобы удалить вариации.

Расширение: удаление вариаций без запаса (outofstock) с учетом срока неактивности

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

  • Имеют статус publish (активны)
  • Статус склада outofstock
  • Не обновлялись более 30 дней (по дате изменения)

function wc_delete_outofstock_old_variations() {
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_modified',
                'before' => $date_threshold,
            ]
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);
    $deleted_count = 0;
    foreach ($variations as $variation_id) {
        $stock_status = get_post_meta($variation_id, '_stock_status', true);
        if ($stock_status === 'outofstock') {
            wp_delete_post($variation_id, true);
            $deleted_count++;
        }
    }
    return $deleted_count . ' outofstock old variations deleted.';
}

Добавьте вызов функции по cron или вручную через админку, аналогично предыдущему примеру.

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

  • Проверьте список вариаций в админке WooCommerce — неактивные вариации должны исчезнуть.
  • Выполните SQL-запрос:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_status IN ('draft', 'private', 'trash');
    — должен вернуть 0.
  • Для вариаций с запасом:
    SELECT COUNT(*) FROM wp_postmeta WHERE meta_key = '_stock_status' AND meta_value = 'outofstock';
    — количество старых «outofstock» вариаций должно уменьшиться.

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

  • Удаление не тех вариаций: убедитесь, что фильтры пост-статуса и даты применяются корректно, иначе можно удалить активные вариации. Тестируйте на копии сайта.
  • Проблемы с правами доступа: код должен запускаться под пользователем с правами manage_woocommerce, иначе удаление не произойдет.
  • Отсутствие резервных копий: всегда делайте бэкап базы перед массовым удалением, чтобы можно было восстановить данные.
  • Плагины кеширования: после удаления вариаций очистите кеш, чтобы изменения отобразились на сайте.

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

  • Запускайте удаление по крону с ограничением по времени и пакетами (например, по 50 вариаций за раз), чтобы не перегрузить сервер.
  • Используйте транзакции базы данных, если поддерживаются, чтобы избежать частичного удаления.
  • Логируйте удаляемые вариации в отдельный файл для аудита и возможного восстановления.
  • Регулярно оптимизируйте таблицы базы данных (особенно wp_posts и wp_postmeta), чтобы избежать фрагментации после массовых удалений.

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

МетодПлюсыМинусыРекомендации
Плагин (например, WP Bulk Delete)Удобство, настройки через UI, безопасностьМожет быть тяжеловесным, лишний код на сайтеПодходит для непрофессионалов, при небольшом объеме
Кастомный код (PHP)Гибкость, точечное решение, отсутствие лишних плагиновТребует навыков PHP, риск ошибокРекомендуется профессионалам и при больших магазинах
Ручное удаление (через админку)Простота, полный контрольДолго, неудобно при большом числе вариацийИспользовать для единичных случаев
Как закрыть от индексации страницы авторов и архивов в WordPress
25.08.2026