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

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

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

Как понять, что у вас есть такая проблема:

  • Много вариаций с атрибутом _stock_status = outofstock или статусом private;
  • В админке WooCommerce в списке вариаций много скрытых или неактивных товаров;
  • Заметно замедлена работа сайта при загрузке страниц с товарами или в админке;
  • Базы данных WooCommerce заметно выросли без видимых причин.

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

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

1. Критерии для удаления вариаций

  • Вариация имеет статус private или trash;
  • Вариация отсутствует на складе более 30 дней;
  • Вариация не имеет заказов за последние 90 дней (опционально).

2. Код для удаления неактивных вариаций

function wproot_delete_inactive_variations() {
    global $wpdb;
    // Определяем дату для фильтрации
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Получаем ID вариаций, которые не в наличии и без активности
    $variations = $wpdb->get_results($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         INNER JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_stock_status' AND pm1.meta_value = 'outofstock'
         WHERE p.post_type = 'product_variation'
         AND p.post_status IN ('private', 'trash')
         AND p.post_modified < %s",
         $date_threshold
    ));

    if(empty($variations)) {
        return 'Нет неактивных вариаций для удаления';
    }

    foreach($variations as $variation) {
        wp_delete_post($variation->ID, true); // Жесткое удаление
    }

    return count($variations) . ' неактивных вариаций удалено';
}

3. Запуск процедуры через WP-Cron

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

add_action('wproot_weekly_delete_variations', 'wproot_delete_inactive_variations');

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

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

Чтобы убедиться, что скрипт работает корректно:

  • Выполните функцию вручную через echo wproot_delete_inactive_variations(); в отладчике или временно в functions.php;
  • Проверьте количество удалённых вариаций в ответе функции;
  • Проверьте в админке WooCommerce список вариаций: неактивных станет меньше;
  • Проверьте размер базы данных через phpMyAdmin или плагин оптимизации.

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

  • Удаление рабочих вариаций: Неправильно заданные условия могут удалить активные товары. Всегда тестируйте на копии сайта и используйте фильтрацию по датам и статусам.
  • Нет разрешений на wp_delete_post: Убедитесь, что используемый пользователь или скрипт имеет права на удаление.
  • WP-Cron не срабатывает: Проверьте, что на сайте включён cron, или настройте системный cron для вызова wp-cron.php.
  • Удалённые вариации возвращаются: Возможно, плагины или интеграции восстанавливают данные – проверьте сторонние процессы.

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

  • Перед удалением всегда делайте резервную копию базы данных.
  • Для больших магазинов ограничивайте количество удаляемых вариаций за один запуск, чтобы избежать тайм-аутов:
function wproot_delete_inactive_variations_chunked($limit = 50) {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
    $variations = $wpdb->get_results($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         INNER JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id AND pm1.meta_key = '_stock_status' AND pm1.meta_value = 'outofstock'
         WHERE p.post_type = 'product_variation'
         AND p.post_status IN ('private', 'trash')
         AND p.post_modified < %s
         LIMIT %d",
         $date_threshold, $limit
    ));

    if(empty($variations)) {
        return 'Нет неактивных вариаций для удаления';
    }

    foreach($variations as $variation) {
        wp_delete_post($variation->ID, true);
    }

    return count($variations) . ' неактивных вариаций удалено';
}
  • Запускайте очистку в ночное время для минимального влияния на пользователей.
  • Используйте плагин Clearfy Pro для дополнительной оптимизации WooCommerce и автоматической чистки базы (https://wpshop.ru/plugins/clearfy?utm_source=wproot.ru&utm_medium=article&utm_campaign=woocommerce-avto-udaleniye-neaktivnyh-varijacij-tovarov).

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

МетодПлюсыМинусыРекомендации
Ручное удаление в админкеПростота, визуальный контрольЗанимает много времени, неэффективно для больших магазиновДля мелких магазинов, разовая чистка
Кастомный PHP-скрипт (как в статье)Автоматизация, точные условия, гибкостьТребует базовых навыков разработки, возможны ошибки при некорректных условияхРекомендуется для разработчиков и опытных администраторов
Плагины оптимизации (например, Clearfy Pro)Удобство, дополнительные функции, поддержкаПлатные решения, возможные конфликты с другими плагинамиДля тех, кто хочет «под ключ» и минимум кода

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как изменить URL выдачи поисковой формы WordPress без плагинов
26.03.2026
Как установить ограничение на число посетителей в WordPress: практическое руководство
16.01.2026
Как создать автоматический sitemap с поддержкой фильтров в WordPress
05.04.2026
Как проверить и исправить ошибки базы данных WordPress: практическое руководство
22.02.2026
Как использовать AJAX в WordPress для обновления контента без перезагрузки страницы
12.01.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше