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

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

Магазины на WooCommerce со временем накапливают множество записей о решах (промежуточных данных, связанных с заказами и пользователями), которые перестали быть актуальными. Это приводит к разрастанию базы данных и замедлению работы сайта, особенно при большом количестве заказов. Встроенных средств для автоматического удаления старой реши WooCommerce нет, поэтому необходима дополнительная настройка с помощью WP-Cron.

Как понять, что накопилась старая реша?

  • Замедленная работа административной панели WooCommerce;
  • Увеличенный размер базы данных, особенно таблиц _wc_session_tokens и _wc_customer_lookup;
  • Появление ошибок или задержек при обработке заказов;
  • Ручная проверка через phpMyAdmin: большое количество записей старше 30-60 дней.

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

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

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

function wplog_delete_old_woocommerce_sessions() {
    global $wpdb;
    $days = 30; // количество дней для хранения сессий
    $expiration = time() - ($days * DAY_IN_SECONDS);

    // Удаляем старые сессии из таблицы _wc_session_tokens
    $deleted_sessions = $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM {$wpdb->prefix}wc_session_tokens WHERE session_expiry < %d",
            $expiration
        )
    );

    // Удаляем старые метаданные сессий из _wc_session_tokens_meta (если есть)
    // Обычно данные хранятся в _wc_session_tokens, дополнительная очистка по необходимости

    return $deleted_sessions;
}

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

Добавьте хук для запуска функции один раз в сутки.

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

add_action( 'wplog_daily_delete_old_sessions', 'wplog_delete_old_woocommerce_sessions' );

3. Очистка заказов и черновиков с метаданными

Если требуется удалять не только сессии, но и заказы со статусом "отменён" или "завершён" старше определённого срока, можно расширить функцию:

function wplog_delete_old_orders() {
    $days = 90;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = [
        'status' => ['cancelled', 'completed'],
        'date_modified' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true — без перемещения в корзину
    }

    return count( $orders );
}

Зарегистрируйте отдельное событие для удаления заказов или включите вызов из основной функции.

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

  • Проверьте таблицу wp_wc_session_tokens через phpMyAdmin до и после запуска WP-Cron — количество записей должно уменьшиться.
  • Запустите вручную крон-событие через WP-CLI: wp cron event run wplog_daily_delete_old_sessions и проверьте результат.
  • Для удаления заказов проверьте список заказов в админке WooCommerce — старые отменённые и завершённые должны исчезнуть.
  • Включите логирование в функции (например, через error_log) для отладки.

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

  • Крон-событие не запускается: Убедитесь, что посещения сайта есть (WP-Cron зависит от них) или настройте системный cron на сервере.
  • Ошибка прав доступа к базе данных: Проверьте настройки подключения к базе и права пользователя MySQL.
  • Удаляются не те данные: Проверьте условия удаления и тестируйте на копии базы.
  • Удаление заказов приводит к потере важных данных: Настройте фильтры и ограничения, чтобы удалять только действительно устаревшие и ненужные заказы.

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

  • Используйте транзакции или пакетное удаление, если объем данных большой, чтобы не блокировать базу.
  • Не запускайте удаление слишком часто — достаточно раз в сутки.
  • Сделайте резервную копию базы перед внедрением автоматического удаления.
  • Для ускорения WP-Cron используйте системный cron и WP-CLI.
  • Логируйте действия удаления для контроля и аудита.

Сравнение способов удаления старой реши WooCommerce

МетодПлюсыМинусыКомпромисс
WP-Cron + код в functions.phpГибкость, нет зависимостейWP-Cron зависит от посещений сайтаНастроить системный cron для надежности
Плагины очистки базы (например, WP-Optimize)Удобство, интерфейсМогут удалять лишнее, нагрузка на сайтИспользовать с осторожностью, делать бэкапы
Ручное удаление через SQLТочный контрольРиск ошибок, требует знаний SQLИспользовать для разовых очисток
Как избежать проблем при использовании AJAX в WordPress
10.04.2026
Как установить ограничение на регистрацию в WordPress по домену email
21.06.2026
Как добавить обязывающее сообщение об ошибке 404 в WooCommerce
10.05.2026
Удаление изображений из библиотеки медиа WordPress по дате
22.02.2026
Автоматическое создание отзывов в WordPress с помощью WPExpert Review
16.03.2026