Как автоматизировать удаление старого контента WooCommerce по дате

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

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

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

  • Увеличение размера базы данных и замедление запросов.
  • Сложности при резервном копировании и восстановлении.
  • Перегрузка административных интерфейсов и отчётов.

Подходы к автоматизации удаления старого контента WooCommerce

Что можно удалять?

В WooCommerce ключевые элементы, которые часто удаляют по дате:

  • Заказы (post_type = 'shop_order'), например, старше года.
  • Товары (post_type = 'product'), которые не продаются и не обновлялись долго.
  • Отзывы и комментарии к товарам по сроку их актуальности.

Выбор метода удаления: плагин или собственный скрипт?

МетодПреимуществаНедостатки
Плагин (например, WP Bulk Delete)Простота настройки, готовый интерфейс, регулярные обновленияЗависимость от стороннего кода, возможна нагрузка на сервер при больших объемах
Собственный скрипт на PHPГибкость, точечное управление, минимальная нагрузка при правильной реализацииТребует навыков программирования, ответственность за тестирование и безопасность

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

1. Создание WP-Cron задачи

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

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

add_action('wpguest_daily_order_cleanup', 'wpguest_delete_old_orders');

2. Функция удаления заказов старше 365 дней

function wpguest_delete_old_orders() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-365 days'));

    // Получаем ID заказов старше года
    $old_orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order' AND post_date < %s",
        $date_threshold
    ));

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // true - без перемещения в корзину
        }
    }
}

3. Очистка и прекращение задачи при необходимости

Если нужно остановить задачу, используйте:

function wpguest_remove_order_cleanup_cron() {
    $timestamp = wp_next_scheduled('wpguest_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpguest_daily_order_cleanup');
    }
}
// Вызовите эту функцию вручную при деактивации темы или плагина

Как проверить, что удаление сработало

  • В админке WooCommerce зайдите в раздел Заказы и отфильтруйте по дате — заказы старше года должны отсутствовать.
  • Проверяйте таблицу wp_posts в базе данных — записи post_type shop_order с датой старше 365 дней должны быть удалены.
  • Для отладки добавьте в функцию wpguest_delete_old_orders запись в лог, например, через error_log:
error_log('Удалено заказов: ' . count($old_orders));

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

  • Задача WP-Cron не запускается
    Причина: на сайте нет посетителей, поэтому WP-Cron не срабатывает. Решение: настроить системный cron на сервере для запуска wp-cron.php или использовать плагин WP Crontrol для проверки и запуска задач вручную.
  • Удаляются не те заказы
    Причина: ошибка в условии даты или типе записи.
    Проверьте правильность post_type и формат даты.
  • Большая нагрузка при удалении
    Удаление большого количества заказов за один запуск может тормозить сайт.
    Решение: разбивать удаление на части, например, обрабатывать по 50 записей за один запуск.

Оптимизация и безопасность

  • Всегда делайте полное резервное копирование базы данных перед автоматическим удалением.
  • Ограничьте права доступа к функциям удаления, чтобы избежать несанкционированного запуска.
  • Для повышения производительности используйте WP_Query с параметром 'posts_per_page' для порционного удаления:
function wpguest_delete_old_orders_batch() {
    $args = [
        'post_type'      => 'shop_order',
        'posts_per_page' => 50,
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '1 year ago',
            ],
        ],
        'fields'         => 'ids',
        'post_status'    => 'any',
    ];

    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}
  • Запускайте функцию из cron с интервалом, чтобы не создавать пиковую нагрузку.
Как автоматизировать удаление старых записей WordPress по дате
01.03.2026
Как автоматизировать удаление неиспользуемых вариативных изображений WooCommerce
12.05.2026
Как автоматизировать управление отзывами в WordPress с помощью WPRemark
14.02.2026
Как автоматизировать управление доступом к записям в WordPress по ролям и меткам
29.03.2026
Автоматическое удаление возвращённых и отменённых заказов WooCommerce
02.07.2026