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

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

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

Типичные признаки проблемы:

  • В базе данных много товаров со статусом draft, pending или private, которые не продаются.
  • Вариации товаров, которые неактивны и не отображаются на сайте, но занимают место.
  • Отсутствие регулярной чистки устаревших позиций.
  • Замедленная работа админки и фронтенда магазина.

Почему важно автоматизировать удаление неактивных товаров и вариаций

Ручное удаление занимает много времени и часто забывается. Автоматизация позволяет:

  • Поддерживать базу данных в чистоте без лишней нагрузки.
  • Повысить скорость загрузки страниц за счёт уменьшения объёма выборок.
  • Избежать ошибок из-за старых данных.

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

1. Определяем критерии неактивности

Для товаров и вариаций под неактивными понимаем:

  • Товары с датой последнего обновления более 180 дней назад и статусом draft или private.
  • Вариации, которые не продаются (статус private или draft).

2. Реализация функции удаления в functions.php или подключаемом файле плагина

function wpset_delete_inactive_products_and_variations() {
    // Параметры даты - 180 дней назад
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    // Удаление неактивных товаров
    $args_products = array(
        'post_type'      => 'product',
        'post_status'    => array('draft', 'private'),
        'date_query'     => array(
            array(
                'column' => 'post_modified',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $products = get_posts($args_products);

    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // Полное удаление
    }

    // Удаление вариаций
    $args_variations = array(
        'post_type'      => 'product_variation',
        'post_status'    => array('draft', 'private'),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $variations = get_posts($args_variations);

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

// Запускаем функцию по крону или вручную
// add_action('wp_loaded', 'wpset_delete_inactive_products_and_variations');

3. Автоматизация через WP-Cron

Для автоматического запуска скрипта добавим событие cron, которое будет срабатывать раз в сутки.

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

add_action('wpset_daily_inactive_cleanup', 'wpset_delete_inactive_products_and_variations');

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

  • Проверьте наличие удалённых товаров в админке WooCommerce — они должны исчезнуть.
  • Выполните запрос к базе данных: SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product' AND post_status IN ('draft', 'private') AND post_modified < DATE_SUB(NOW(), INTERVAL 180 DAY); — должен вернуть 0.
  • Проверьте логи сервера на предмет ошибок при запуске скрипта.
  • Для проверки cron: запустите do_action('wpset_daily_inactive_cleanup'); вручную в файле или через консоль WP-CLI.

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

  • Функция не запускается по расписанию. Проверьте, активен ли WP-Cron и нет ли конфликтов с плагинами, блокирующими cron.
  • Удаляются нужные товары. Проверьте критерии выборки, возможно, нужно изменить статус или дату.
  • Скрипт занимает слишком много времени. Разбейте выборку на партии (например, по 50 записей за раз) с помощью параметра posts_per_page.
  • Потеря данных без возможности восстановления. Рекомендуется делать резервные копии перед запуском.

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

  • Резервное копирование: настройте автоматический бэкап базы перед запуском удаления.
  • Логирование действий: добавьте запись в лог для каждого удалённого товара/вариации.
  • Оптимизация запросов: используйте fields => 'ids' для минимизации нагрузки на базу.
  • Тестирование на staging-сервере: перед внедрением в продакшен проверяйте скрипт в тестовой среде.

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

МетодПлюсыМинусыКомпромисс
Ручное удаление в админкеПростота, полный контрольВремя, риск пропускаПодходит для маленьких магазинов
Плагины очистки (например, WP Sweep)Удобство, интерфейсМогут удалять лишнее, нагрузкаИспользовать с осторожностью
Собственный скрипт на PHP + WP-CronГибкость, автоматизацияТребует навыков, настройкаЛучший вариант для крупных магазинов
WooCommerce: автоматическое изменение цен и скидок при обновлении атрибутов товара
08.06.2026
Как создать автоматические ответы на комментарии в WordPress
30.12.2025
WooCommerce: как автоматически отключать электронные письма после отмены заказа
27.06.2026
Автоматический импорт товаров из YML в WordPress: пошаговое руководство
05.02.2026
Как отключить системные email-уведомления WordPress без плагинов
07.04.2026