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

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

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

Основные признаки проблемы:

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

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

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

Для начала нужно определить, по каким параметрам считать вариацию неактуальной. Чаще всего это отсутствие на складе (stock = 0) и длительный период отсутствия продаж или обновлений.

2. Создание WP-Cron задачи для регулярной очистки

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

3. Код для удаления вариаций

add_action('wp_loaded', 'register_clear_old_variations_cron');
function register_clear_old_variations_cron() {
    if (!wp_next_scheduled('clear_old_variations_hook')) {
        wp_schedule_event(time(), 'daily', 'clear_old_variations_hook');
    }
}

add_action('clear_old_variations_hook', 'clear_old_variations_function');
function clear_old_variations_function() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
            ],
        ],
    ];

    $variations = get_posts($args);
    $count_deleted = 0;

    foreach ($variations as $variation) {
        // Дополнительно можно проверить дату последней продажи или обновления мета
        wp_delete_post($variation->ID, true);
        $count_deleted++;
    }

    if ($count_deleted) {
        error_log("Удалено неактуальных вариаций товаров: " . $count_deleted);
    }
}

4. Дополнительная фильтрация по дате последней продажи (опционально)

Если у вас есть мета данные или пользовательские поля с датой последней продажи или обновления варианта, добавьте их в meta_query для более точного удаления.

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

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

  • Запустите вручную функцию clear_old_variations_function() в среде разработки.
  • Проверьте, что вариации с _stock_status=outofstock удалились из базы данных (через админку или запрос к БД).
  • Убедитесь, что на фронтенде и в админке отображаются только актуальные варианты.
  • Проверьте файл лога error_log на наличие сообщений об удалении.

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

  • Не запускается WP-Cron: Убедитесь, что на сайте посещают страницы, иначе WP-Cron не сработает. Для теста используйте плагин WP Crontrol или вызовите функцию вручную.
  • Вариации не удаляются: Проверьте права пользователя, под которым работает скрипт, и параметр wp_delete_post($id, true) — второй аргумент true гарантирует безвозвратное удаление.
  • Удаляются нужные варианты: Проверьте критерии фильтрации, возможно, стоит добавить дополнительную проверку даты последней продажи.
  • Перегрузка сервера при большом количестве вариаций: Разбейте удаление на партии, например, по 100 записей за раз, используя параметр 'posts_per_page' и offset.

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

  • Всегда делайте резервную копию базы перед массовыми удалениями.
  • Используйте транзиенты или опции для хранения времени последнего запуска и разбивайте процесс удаления на несколько циклов.
  • Логируйте результаты в файл или систему мониторинга для своевременного обнаружения ошибок.
  • Если каталог очень большой, рассмотрите использование WP-CLI для запуска скрипта вне веб-сессии.
  • Ограничьте доступ к функциям удаления только администраторам через проверки capability.

Сравнение вариантов решения

МетодПлюсыМинусыКомпромисс
Плагин очисткиБыстрая настройка, UIНагрузка, ограниченная кастомизацияИспользовать только для небольших магазинов
Собственный cron с кодомГибкость, оптимизация по задачамТребует навыков PHP и тестированияЛучший вариант для крупных проектов
Ручное удалениеПростотаНеавтоматично, риск ошибокИспользовать для разовых случаев
Как создать собственный шорткод в WordPress
14.11.2025
Как создать настройки темы в WordPress с примерами кода
18.11.2025
Как избежать проблем с кэшированием в WordPress: практические решения
01.01.2026
Как создать мультиязычный сайт на WordPress без плагинов
17.01.2026
Как создать динамические таблицы в WordPress с помощью шорткода
17.12.2025