Диагностика задачи: зачем и когда удалять заказы автоматически
В стандартном WooCommerce заказы сохраняются в базе данных навсегда. Это может привести к росту размера базы, замедлению работы сайта и усложнению аналитики. Например, магазины с большим числом тестовых или отменённых заказов нуждаются в автоматическом удалении старых записей, чтобы поддерживать базу в чистоте. Проблема в том, что WooCommerce не предлагает встроенных инструментов для удаления заказов по срокам.
Решение: автоматическое удаление заказов по сроку через WP-Cron
Для автоматизации процесса используем WP-Cron – планировщик заданий WordPress. Создадим функцию, которая будет удалять заказы старше заданного количества дней, и настроим расписание.
1. Добавление функции удаления заказов
function wpsocial_delete_old_wc_orders() {
$days = 30; // Удалять заказы старше 30 дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'status' => array('cancelled', 'failed', 'refunded'), // Статусы заказов для удаления
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Перемещаем в корзину
// Для полного удаления используйте wp_delete_post($order_id, true);
}
}
}2. Регистрация задачи WP-Cron
Добавим планировщик, который будет запускать функцию ежедневно:
add_action('wpsocial_daily_order_cleanup', 'wpsocial_delete_old_wc_orders');
function wpsocial_activate_cron() {
if (!wp_next_scheduled('wpsocial_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpsocial_daily_order_cleanup');
}
}
add_action('wp', 'wpsocial_activate_cron');3. Отключение задачи при деактивации темы или плагина
function wpsocial_deactivate_cron() {
$timestamp = wp_next_scheduled('wpsocial_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpsocial_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpsocial_deactivate_cron');Проверка результата после внедрения
- Выполните в консоли сайт запрос
wp cron event run wpsocial_daily_order_cleanup(через WP-CLI) для моментального запуска. - Проверьте в админке WooCommerce список заказов с указанными статусами, дата создания которых старше 30 дней – они должны быть в корзине или удалены.
- Для отладки добавьте логирование в функцию:
error_log('Удален заказ ID: ' . $order_id);Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP-Cron работает на сервере (иногда требуется реальный cron). Можно принудительно запустить через WP-CLI.
- Удаляются не те заказы: Обратите внимание на статус заказов в параметре
'status'. Стандартные статусы:'pending','processing','completed','cancelled','failed','refunded'. Убедитесь, что указали нужные. - База данных не уменьшается: Если используете
wp_trash_post, заказы перемещаются в корзину, а не удаляются окончательно. Для полного удаления используйтеwp_delete_post($order_id, true), но учитывайте, что восстановить данные будет нельзя. - Ошибка памяти или таймаута: Если заказов очень много, разделите удаление на порции, например, по 50 заказов за раз, используя параметр
'limit'и последовательно вызывайте функцию несколько раз.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы перед автоматическим удалением заказов.
- Используйте безопасные статусы заказов для удаления – не удаляйте
'completed'или'processing', чтобы не потерять важные данные. - Запускайте WP-Cron через системный cron, если нагрузка сайта высока – это повысит надёжность.
- Для повышения производительности удаляйте заказы пакетами, чтобы избежать перегрузки БД.
- Логируйте процесс удаления для контроля и отладки.
Сравнение вариантов удаления заказов в WooCommerce
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| wp_trash_post (перемещение в корзину) | Можно восстановить; безопаснее | Не удаляет данные; база растёт | |
| wp_delete_post с true (полное удаление) | Освобождает место в базе | Нельзя восстановить; риск потери данных | |
| Вручную через SQL-запросы | Максимальная скорость и контроль | Риск повреждения базы; требует знаний | Не рекомендуется без опыта |