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

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

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

Какие типы контента можно удалять автоматически

  • Товары: устаревшие или неактивные товары, которые не продаются и не должны отображаться в каталоге.
  • Заказы: завершённые или отменённые заказы старше определённого срока.
  • Купоны: неактивные или истёкшие купоны, которые уже не нужны.

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

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

Для удаления товаров, которые не обновлялись месяц и более, используйте следующий код в файле functions.php вашей темы или в кастомном плагине:

function wpmanual_delete_old_products() {
    $args = [
        'post_type'      => 'product',
        'date_query'     => [
            [
                'column' => 'post_modified_gmt',
                'before' => '30 days ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'post_status'    => ['publish', 'pending', 'draft'],
    ];
    $products = get_posts($args);
    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // true - удаление без отправки в корзину
    }
}

2. Создание функции удаления старых заказов

Заказы, которые завершены или отменены и старше 90 дней можно удалить так:

function wpmanual_delete_old_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-completed', 'wc-cancelled'],
        'date_query'     => [
            [
                'column' => 'post_date_gmt',
                'before' => '90 days ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

3. Удаление неактивных купонов

Купоны с истекшим сроком действия удаляются по дате date_expires в метаполях:

function wpmanual_delete_expired_coupons() {
    $args = [
        'post_type'      => 'shop_coupon',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => 'date_expires',
                'value'   => current_time('timestamp'),
                'compare' => '<',
                'type'    => 'NUMERIC',
            ],
        ],
        'fields'         => 'ids',
    ];
    $coupons = get_posts($args);
    foreach ($coupons as $coupon_id) {
        wp_delete_post($coupon_id, true);
    }
}

4. Регистрация WP-Cron задачи

Добавьте в functions.php регистрацию периодического задания:

add_action('wpmanual_daily_cleanup', 'wpmanual_delete_old_products');
add_action('wpmanual_daily_cleanup', 'wpmanual_delete_old_orders');
add_action('wpmanual_daily_cleanup', 'wpmanual_delete_expired_coupons');

if (!wp_next_scheduled('wpmanual_daily_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpmanual_daily_cleanup');
}

5. Очистка Cron при деактивации плагина или темы

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

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

  • Перейдите в админку WordPress > Инструменты > Запланированные задачи (например, с помощью плагина WP Crontrol) и убедитесь, что задача wpmanual_daily_cleanup запланирована.
  • Запустите задачу вручную через WP Crontrol, если нужно проверить немедленно.
  • Проверьте таблицу wp_posts в базе данных: старые товары, заказы и купоны должны быть удалены.
  • Проверьте, что на сайте и в админке отсутствует удалённый контент.

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

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

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

  • Всегда делайте резервную копию базы данных перед настройкой автоматического удаления.
  • Используйте wp_delete_post($id, true) для полного удаления без корзины, чтобы не накапливать мусор.
  • Для больших магазинов лучше разбивать удаление на небольшие партии, чтобы избегать превышения лимитов памяти.
  • Для контроля можно логировать удалённые ID в файл или использовать плагин для аудита.
  • Проверяйте работу WP-Cron с помощью плагинов вроде WP Crontrol, чтобы убедиться в регулярности запуска.
  • Если на сервере настроен системный cron, отключите штатный WP-Cron, чтобы избежать конфликтов.

Сравнение вариантов автоматического удаления в WooCommerce

МетодПлюсыМинусыКогда использовать
WP-Cron с кастомным кодом Гибкость, полное управление, без сторонних плагинов Зависит от активности сайта, требует навыков программирования Магазины с разработчиками, где важна кастомизация
Плагины очистки (например, WP-Sweep, Advanced Database Cleaner) Простота настройки, готовые интерфейсы Могут удалять не только WooCommerce контент, риск потери данных Малые магазины без разработчиков
Внешние скрипты и CRON сервера Независимость от WP-Cron, высокая стабильность Требует доступа к серверу и навыков системного администрирования Крупные проекты с высокими требованиями к стабильности
Как сделать автоматическое резервное копирование WordPress: лучшие методы и примеры кода
25.11.2025
Как удалить пустые категории в WordPress с помощью кода
08.01.2026
WooCommerce: не отображаются товары после обновления — как быстро исправить
20.05.2026
Как удалить неиспользуемые шорткоды в WordPress
17.12.2025
Как удалить заблокированных пользователей WordPress с помощью кода
30.03.2026