Диагностика проблемы: зачем и когда нужно удалять заказы автоматически
В стандартном WooCommerce нет встроенного механизма для удаления заказов по статусу автоматически. Это приводит к накоплению старых, отменённых или завершённых заказов, которые могут загромождать базу данных и влиять на производительность. Особенно актуально для магазинов с большим количеством транзакций.
Задача: настроить автоматическое удаление заказов, например, со статусом cancelled или failed, по истечении определённого времени.
Пошаговое решение: настройка Cron задачи для удаления заказов
1. Добавляем функцию удаления заказов по статусу
Создайте в файле functions.php вашей темы или в кастомном плагине следующий код:
function wpzen_delete_orders_by_status() {
$statuses_to_delete = array('cancelled', 'failed');
$days_threshold = 30; // Удалять заказы старше 30 дней
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));
foreach ($statuses_to_delete as $status) {
$args = array(
'status' => $status,
'limit' => -1,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->delete(true); // true — полное удаление из базы
}
}
}
}2. Регистрируем Cron задачу
Добавьте проверку и регистрацию задачи при инициализации WordPress:
add_action('wpzen_daily_delete_orders_event', 'wpzen_delete_orders_by_status');
function wpzen_activate_delete_orders_cron() {
if (! wp_next_scheduled('wpzen_daily_delete_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpzen_daily_delete_orders_event');
}
}
add_action('wp', 'wpzen_activate_delete_orders_cron');3. Удаляем Cron задачу при деактивации плагина или отключении темы
function wpzen_deactivate_delete_orders_cron() {
$timestamp = wp_next_scheduled('wpzen_daily_delete_orders_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpzen_daily_delete_orders_event');
}
}
register_deactivation_hook(__FILE__, 'wpzen_deactivate_delete_orders_cron');Проверка результата после внедрения
- Проверьте наличие Cron задачи с помощью плагина Clearfy или WP Crontrol.
- Создайте тестовые заказы со статусом
cancelledи датой старше 30 дней. - Запустите Cron вручную (через WP Crontrol) или дождитесь автоматического запуска.
- Убедитесь, что старые заказы удалены из админки WooCommerce.
Частые ошибки и как исправить
- Заказы не удаляются: Проверьте, что хук Cron зарегистрирован и активен. Убедитесь, что функция
wc_get_ordersвозвращает ID заказов, а не пустой массив. - Удаление происходит, но заказы отображаются в базе: Метод
delete(true)удаляет заказ полностью, если передатьfalse, заказ только переносится в корзину. Проверьте, что передаётеtrue. - Cron не запускается на локальном сервере: WP Cron зависит от посетителей сайта. Для локальной разработки используйте системный cron или запускайте задачи вручную через WP CLI.
Практические советы по безопасности и производительности
- Запускайте удаление не чаще раза в сутки, чтобы минимизировать нагрузку на базу.
- Добавьте в функцию логирование удалённых заказов, чтобы отслеживать процесс:
function wpzen_delete_orders_by_status() {
$statuses_to_delete = array('cancelled', 'failed');
$days_threshold = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));
foreach ($statuses_to_delete as $status) {
$args = array(
'status' => $status,
'limit' => -1,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
error_log("[WPZen] Удаление заказа #" . $order_id);
$order->delete(true);
}
}
}
}- Перед удалением сделайте резервное копирование базы, чтобы избежать потери данных.
Сравнение подходов к удалению заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Просто, не требует кода | Трудоёмко при большом количестве заказов |
| Плагин для массового удаления заказов | Удобно, интерфейс | Дополнительный плагин, может конфликтовать |
| Автоматизация через WP Cron (код) | Автоматично, гибко настраивается | Требует навыков программирования, настройка Cron |