Диагностика проблемы: зачем очищать корзины и отменённые заказы
В WooCommerce накапливаются данные о заброшенных корзинах и отменённых заказах. Это влияет на размер базы данных, скорость запросов и может затруднять аналитику. Если корзины не очищать, в базе будут храниться устаревшие данные, а отменённые заказы могут мешать корректному учёту продаж и нагрузке на сервер.
Пошаговое решение: как автоматически удалять заброшенные корзины и отменённые заказы
1. Автоматическое удаление заброшенных корзин
В WooCommerce корзина хранится в сессиях и в базе данных в виде woocommerce_sessions. Удаление старых сессий очистит корзины.
Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код для очистки сессий старше 24 часов:
add_action('wp_scheduled_delete', 'wc_clear_old_cart_sessions');
function wc_clear_old_cart_sessions() {
global $wpdb;
$expiration = time() - DAY_IN_SECONDS; // 24 часа назад
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
$expiration
)
);
}Этот код использует стандартное событие WordPress wp_scheduled_delete, которое вызывается раз в день. Он удалит все сессии, срок действия которых истёк.
2. Автоматическое удаление отменённых заказов
Для удаления заказов со статусом cancelled через 7 дней после изменения статуса используйте следующий код:
function wc_clear_cancelled_orders() {
$args = [
'status' => 'cancelled',
'date_modified' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
add_action('wp_scheduled_delete', 'wc_clear_cancelled_orders');Этот код также запускается при событии wp_scheduled_delete и удаляет отменённые заказы старше 7 дней.
Проверка результата после внедрения
- Зайдите в базу данных через phpMyAdmin или аналог и проверьте таблицу
woocommerce_sessions— в ней не должно быть записей со сроком действия менее 24 часов назад. - В разделе WooCommerce → Заказы проверьте, что отменённые заказы старше 7 дней отсутствуют.
- Для контроля можно добавить логирование в функции очистки, например, через
error_log().
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, что событие
wp_scheduled_deleteсрабатывает. Можно запускать вручную с помощью WP-CLI:wp cron event run wp_scheduled_delete. - Удаляются не те заказы: проверьте параметры в
wc_get_orders(). Для фильтра по дате используйте правильный формат даты или timestamp, иногда помогает использованиеdate_query. - Удаление корзин не влияет на вид в админке: корзины хранятся в сессиях, их удаление не отображается в интерфейсе, проверьте через базу данных.
- Проблемы с правами на удаление заказов: убедитесь, что код запускается с правами администратора (например, из плагина или functions.php).
Практические советы по безопасности и производительности
- Проверяйте перед удалением, что заказы не связаны с активными возвратами или спорами.
- Не удаляйте заказы сразу после отмены — давайте буфер времени (7+ дней).
- Для больших магазинов используйте WP-CLI скрипты для пакетной очистки, чтобы не перегружать сервер.
- Настройте резервное копирование перед внедрением автоматического удаления.
- Вместо полного удаления можно сначала переводить заказы в статус «архив» с помощью пользовательского статуса, чтобы сохранить историю.
Сравнение вариантов автоматической очистки
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Код в functions.php | Полный контроль, без сторонних плагинов | Требует навыков, возможны ошибки при обновлениях | Пример кода выше |
| Плагины (например, WP-Cron Manager + Cleanup) | Удобный интерфейс, дополнительные настройки | Нагрузка на сайт, лишние зависимости | Плагины нужно тщательно выбирать |
| WP-CLI скрипты | Быстрая пакетная очистка, подходит для больших сайтов | Требует SSH доступа и знаний командной строки | wp post delete $(wp post list --post_type=shop_order --post_status=cancelled --date_query_column=post_modified --before='7 days ago' --format=ids) --force |