Как использовать WP-Cron для автоматического удаления старых вариативных товаров WooCommerce

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

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

Если не удалять такие товары вручную, база данных «раздувается», поисковые запросы медленнее обрабатываются, а клиенты могут столкнуться с устаревшими вариантами в каталоге.

Как определить старые вариативные товары в WooCommerce

В WooCommerce вариативные товары — это дочерние товары с типом product_variation, у которых есть дата создания (post_date). Для автоматизации удаления необходимо задать критерий «старости», например, товары, не обновлявшиеся и не продававшиеся более 180 дней.

Основной параметр для фильтрации:

  • post_type = 'product_variation'
  • Дата создания или последнего изменения (post_modified) старше 180 дней

Пошаговое решение: настройка WP-Cron для удаления старых вариаций

Шаг 1. Создаём функцию удаления старых вариативных товаров

function wpcommunity_delete_old_variations() {
    global $wpdb;
    $days = 180; // Порог в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID вариативных товаров старше threshold
    $old_variations = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_modified < %s",
        $date_threshold
    ));

    if (!empty($old_variations)) {
        foreach ($old_variations as $variation_id) {
            wp_delete_post($variation_id, true); // Полное удаление
        }
    }
}

Шаг 2. Регистрируем событие WP-Cron

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

add_action('wpcommunity_variation_cleanup_hook', 'wpcommunity_delete_old_variations');

Шаг 3. Очистка при деактивации плагина/темы

function wpcommunity_clear_scheduled_variation_cleanup() {
    $timestamp = wp_next_scheduled('wpcommunity_variation_cleanup_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpcommunity_variation_cleanup_hook');
    }
}
register_deactivation_hook(__FILE__, 'wpcommunity_clear_scheduled_variation_cleanup');

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

  • Выполните вручную функцию wpcommunity_delete_old_variations() из консоли WP-CLI или временно вызвав её в шаблоне, чтобы убедиться, что старые вариации удаляются.
  • Проверьте таблицу wp_posts на наличие записей с post_type = 'product_variation' и датой < 180 дней: они должны исчезать после запуска cron.
  • Для отладки используйте логирование — добавьте error_log('Deleted variation ID: '.$variation_id); внутри цикла удаления.
  • Проверьте фронтенд магазина, чтобы убедиться, что удалённые вариации не отображаются в списках товаров и на страницах вариаций.

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

  • Планировщик не запускается: WP-Cron зависит от посещений сайта. Для теста выполните wget -q -O - https://example.com/wp-cron.php?doing_wp_cron или настройте системный cron.
  • Удаление не происходит из-за прав: убедитесь, что функция вызывается с правами администратора или через WP-Cron, а не напрямую без авторизации.
  • Удаляются не все старые вариации: проверьте правильность даты в post_modified и используйте post_date в запросе, если требуется.
  • Потеря данных: используйте wp_delete_post($id, true) для полного удаления, иначе записи попадут в корзину.

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

  • Запускайте удаление один раз в день, чтобы снизить нагрузку.
  • Перед удалением создавайте резервную копию базы данных (например, с помощью плагина Clearfy Pro: https://wpshop.ru/plugins/clearfy).
  • Добавьте логирование для мониторинга и отладки процесса.
  • Если магазин большой, разбивайте удаление на пачки по 50-100 товаров, чтобы избежать таймаутов.

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

МетодОписаниеПреимуществаНедостатки
Ручное удалениеУдаление через админку WooCommerceПростота, контрольНепрактично для большого объёма, трудозатратно
WP-Cron с кастомной функциейАвтоматическое удаление по расписаниюАвтоматизация, снижение нагрузкиЗависит от WP-Cron, требует тестирования
Плагин для очистки базыСторонние решения с графическим интерфейсомУдобство, дополнительные функцииМожет влиять на производительность, требует доверия к разработчику
Как отключить автоматическое обновление тем и плагинов в WordPress
17.04.2026
Как автоматизировать обновление пользовательских ролей в WordPress
22.12.2025
Как отключить AJAX в Gravity Forms и использовать собственный AJAX-обработчик в WordPress
13.02.2026
Как использовать фильтры WooCommerce для автоматического изменения стоимости товаров
03.06.2026
Как автоматизировать удаление неиспользуемых купонов в WooCommerce
21.05.2026

Задать вопрос о вордпресс, получить ответ - это все можно сделать в нашем сообществе WP. Сайт в данный момент в разработке, изучите ссылки ниже: