Диагностика проблемы: зачем удалять старые заказы WooCommerce
WooCommerce хранит все заказы в базе данных, включая завершённые и отменённые. За длительную работу магазина количество записей может достигать сотен тысяч, что замедляет работу сайта и увеличивает размер базы данных. Автоматическое удаление заказов старше 30 дней помогает поддерживать базу в оптимальном состоянии без ручного вмешательства.
Пошаговое решение: автоматизация удаления заказов через WP-Cron
1. Создание функции удаления заказов
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код, который удалит заказы со статусом completed, завершённые более 30 дней назад:
function wporders_delete_old_completed_orders() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов со статусом completed старше 30 дней
$order_ids = $wpdb->get_col(
$wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < %s",
$date_threshold
)
);
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // принудительное удаление
}
}
}
2. Регистрация WP-Cron задачи
Для автоматического запуска функции регулярно зарегистрируем событие cron. В данном примере — запуск один раз в сутки:
function wporders_schedule_delete_old_orders() {
if (!wp_next_scheduled('wporders_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wporders_daily_delete_old_orders');
}
}
add_action('wp', 'wporders_schedule_delete_old_orders');
add_action('wporders_daily_delete_old_orders', 'wporders_delete_old_completed_orders');
3. Очистка расписания при деактивации
Чтобы не оставлять висячие задачи, добавьте удаление cron при деактивации плагина или отключении темы:
function wporders_clear_cron_on_deactivation() {
$timestamp = wp_next_scheduled('wporders_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wporders_daily_delete_old_orders');
}
}
register_deactivation_hook(__FILE__, 'wporders_clear_cron_on_deactivation');
Проверка результата после внедрения
- Запустите функцию вручную, вызвав
wporders_delete_old_completed_orders()через консоль WP-CLI или временный вызов в коде. - Проверьте, что заказы старше 30 дней со статусом
wc-completedудалены из базы (таблицаwp_postsиwp_postmeta). - Убедитесь, что WP-Cron задача добавлена:
wp cron event listв WP-CLI или через плагин Query Monitor. - Через сутки проверьте, что новые старые заказы тоже удаляются автоматически.
Частые ошибки и как их исправить
- Функция не запускается по расписанию: убедитесь, что WordPress Cron работает. На локальных серверах часто cron не срабатывает без посещения сайта. Для теста вызовите функцию вручную.
- Удаляются не те заказы: проверьте корректность условия
post_status = 'wc-completed'. Статусы могут быть кастомными, учитывайте их в запросе. - Удаление не полное:
wp_delete_post($order_id, true)удаляет заказ и метаданные. Если остались записи, проверьте сторонние плагины, которые могут создавать связи. - Проблемы с производительностью при большом количестве заказов: разбивайте удаление на части, используя лимит в SQL и циклы.
Практические советы по безопасности и производительности
- Перед удалением делайте резервное копирование базы данных.
- Для больших магазинов используйте пакетную обработку, например, удалять по 100 заказов за раз.
- Учитывайте, что удаление заказов может повлиять на отчёты и аналитику, убедитесь, что это приемлемо.
- Контролируйте доступ к функциям удаления, не давайте запускать их неавторизованным пользователям.
Сравнение вариантов реализации удаления заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + wp_delete_post | Простота, интеграция с WordPress | Зависит от трафика, медленнее для большого объёма | Код из статьи |
| SQL-запросы напрямую | Быстрее при больших объёмах | Риск повреждения данных, сложность поддержки | |
| Плагины очистки базы | Удобство, интерфейс | Не всегда гибко, может удалять лишнее | WP-Optimize, Advanced Database Cleaner |