Диагностика проблемы: зачем удалять просмотренные заказы
В WooCommerce по умолчанию заказы сохраняются в базе данных вне зависимости от их статуса или активности пользователя. В некоторых случаях, особенно на сайтах с большим числом тестовых или отменённых заказов, база данных разрастается, что замедляет работу админ-панели и увеличивает нагрузку на сервер. Автоматическое удаление заказов, которые были просмотрены и неактивны, помогает поддерживать чистоту базы и ускорить работу сайта.
Что значит «просмотренный заказ» и какие статусы учитывать
Под «просмотренным» в данном случае будем понимать заказ, который был в состоянии cancelled, failed или refunded и который был просмотрен в админке (или в панели пользователя) более определённого времени назад. Именно эти статусы чаще всего связаны с неактивными, неиспользуемыми заказами.
Почему не удалять заказы со статусом completed или processing
Заказы с этими статусами — активные, связанные с реальными покупками. Их удаление приведёт к потере данных и нарушению учёта.
Пошаговое решение: код для автоматического удаления просмотренных заказов
Добавим в файл functions.php вашей темы или в кастомный плагин следующий код:
function wp24_auto_delete_viewed_orders() {
global $wpdb;
// Время в секундах: 30 дней
$days = 30;
$time_limit = time() - ( 60 * 60 * 24 * $days );
// Получаем ID заказов со статусами cancelled, failed, refunded
$order_statuses = array('wc-cancelled', 'wc-failed', 'wc-refunded');
$placeholders = implode(",", array_fill(0, count($order_statuses), '%s'));
$query = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status IN ($placeholders)
AND post_modified < %s",
...$order_statuses, date('Y-m-d H:i:s', $time_limit)
);
$order_ids = $wpdb->get_col($query);
if (empty($order_ids)) {
return;
}
foreach ($order_ids as $order_id) {
// Можно добавить проверку, что заказ был просмотрен (опционально)
wp_delete_post($order_id, true); // Полное удаление
}
}
// Запускаем задачу ежедневно
if (!wp_next_scheduled('wp24_daily_delete_viewed_orders')) {
wp_schedule_event(time(), 'daily', 'wp24_daily_delete_viewed_orders');
}
add_action('wp24_daily_delete_viewed_orders', 'wp24_auto_delete_viewed_orders');Этот код удалит заказы со статусами «отменён», «ошибочный» и «возвращён» старше 30 дней. Вы можете изменить период в переменной $days.
Объяснение кода
- Используется WP-Cron для запуска задачи раз в сутки.
- Получаем ID заказов по статусу и дате последнего изменения.
- Удаляем заказы полностью из базы с помощью
wp_delete_postс флагомtrue.
Проверка результата после внедрения
- Перейдите в админку WooCommerce – заказы.
- Выберите фильтр по статусам «Отменён», «Ошибочный» и «Возвращён».
- Проверьте, что заказы старше 30 дней отсутствуют.
- Для полной проверки запустите WP-Cron вручную, например, с помощью плагина WP Crontrol.
Частые ошибки и как их исправить
- Удаляются активные заказы: Проверьте, что в массиве
$order_statusesуказаны только статусы, которые действительно безопасно удалять. - Задача WP-Cron не запускается: Убедитесь, что на сайте есть посещения, или используйте системный CRON для вызова
wp-cron.php. - Заказы не удаляются: Проверьте права пользователя, под которым запускается скрипт, и наличие ошибок в логах PHP.
Практические советы по безопасности и производительности
- Перед удалением сделайте полную резервную копию базы данных.
- Если на сайте очень много заказов, разбивайте удаление на части, чтобы избежать таймаутов.
- Используйте плагин Clearfy Pro для дополнительной чистки базы и оптимизации сайта https://wpshop.ru/plugins/clearfy.
Сравнение способов удаления заказов в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление вручную через админку | Просто, не требует кода | Долгое, неэффективно при большом объёме заказов |
| Плагины для очистки базы | Удобно, автоматизация | Зависимость от стороннего кода, может быть платным |
| Код на PHP с WP-Cron (предложенный) | Полный контроль, бесплатно, автоматизация | Требуются базовые навыки разработки, настройка WP-Cron |