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

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

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

Определение устаревшего контента

Чаще всего под старым контентом понимают:

  • Продукты, неактивные более 6 месяцев;
  • Черновики и авто-сохранения товаров старше 30 дней;
  • Заказы со статусом «Отменен» или «Возврат» старше 1 года.

Важно правильно определить критерии, чтобы не удалить нужные данные.

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

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

Для удаления продуктов, которые не обновлялись более 180 дней и находятся в статусе «черновик» или «приватный», можно использовать WP_Query и функцию wp_delete_post.

function delete_old_products() {
    $args = [
        'post_type'      => 'product',
        'post_status'    => ['draft', 'private'],
        'date_query'     => [
            [
                'column' => 'post_modified_gmt',
                'before' => '180 days ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $old_products = get_posts($args);
    foreach ($old_products as $product_id) {
        wp_delete_post($product_id, true); // true — принудительное удаление без перемещения в корзину
    }
}
add_action('wp_scheduled_delete', 'delete_old_products');

2. Очистка старых заказов с определенными статусами

Заказы в WooCommerce — это тип поста shop_order. Для удаления заказов со статусом cancelled или refunded старше 365 дней:

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

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

Чтобы регулярное удаление происходило автоматически, добавим задачу в планировщик WordPress.

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

add_action('wp_custom_old_content_cleanup', function() {
    delete_old_products();
    delete_old_cancelled_orders();
});

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

  • В административной панели WooCommerce проверьте наличие старых продуктов и заказов — они должны исчезнуть спустя сутки после активации.
  • Для отладки временно добавьте error_log в функции удаления, чтобы видеть, какие ID удаляются.
  • Выполните вручную крон-задачу через WP-CLI: wp cron event run wp_custom_old_content_cleanup, чтобы проверить работу кода сразу.

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

  • Удаление нужных данных из-за неправильного условия даты — всегда проверяйте, что date_query настроен правильно, и тестируйте на копии сайта.
  • Неправильные статусы заказов — статусы WooCommerce имеют префикс wc-. Без него заказы не найдутся.
  • Отсутствие прав на удаление — убедитесь, что код выполняется с правами администратора (обычно в кроне это не проблема).
  • Запуск крона не происходит — проверьте, что WordPress Cron включен и сайт получает трафик, или настройте системный cron.

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

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

Сравнение вариантов реализации удаления старого контента

СпособПлюсыМинусы
Ручное удаление через админкуПростота, контрольТрудоемко, риск пропуска
Автоматизация через WP-Cron (код)Полный контроль, гибкостьТребует навыков, возможны ошибки
Плагины очистки базы (например, WP-Optimize)Удобство, дополнительные функцииМожет удалить лишнее, нагрузка
WordPress: как использовать REST API для авторизации пользователей
15.01.2026
Как использовать WPCommunity для создания форума на WordPress
22.12.2025
Как создать автоматическую оптимизацию изображений в WordPress
12.03.2026
Как решить проблему нерабочих хуков WooCommerce после обновления
31.05.2026
Как создать автоматический заголовок для постов в WordPress с помощью кода и плагинов
05.03.2026