Диагностика проблемы: зачем удалять заказы после архивирования
В WooCommerce с течением времени база данных заказов растет, что замедляет работу админки и увеличивает нагрузку на сервер. При этом многие владельцы магазинов хранят закрытые или архивированные заказы, которые уже не нужны в активной базе, но занимают место. Автоматическое удаление таких заказов позволяет поддерживать базу в оптимальном состоянии, снижая размер базы и ускоряя запросы.
Задача: настроить автоматическое удаление заказов, которые переведены в статус архивированных (например, custom статус archived или стандартный completed с дополнительной проверкой), через определённый период после архивирования.
Настройка автоматического удаления заказов в WooCommerce
1. Проверка текущих статусов заказов
По умолчанию WooCommerce не имеет статуса archived. Нужно убедиться, какой статус используется для пометки архивных заказов. Чаще всего используется статус completed или настраиваемый статус.
Для проверки статусов выполните в консоли WP или через плагин WP-CLI:
wp post list --post_type=shop_order --fields=ID,post_status --posts_per_page=10Или в коде сделать вывод статусов заказов:
function get_order_statuses() {
$statuses = wc_get_order_statuses();
print_r($statuses);
}
add_action('admin_init', 'get_order_statuses');2. Добавление WP-Cron задачи для удаления заказов
Создадим задачу, которая будет запускаться ежедневно и удалять заказы старше X дней в статусе архивирования. Ниже пример для статуса completed и срока 30 дней.
function wps_delete_old_completed_orders() {
$days = 30;
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
);
$args = array(
'limit' => -1,
'status' => 'completed',
'date_created' => $date_query,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
add_action('wps_daily_delete_orders', 'wps_delete_old_completed_orders');
// Планируем событие, если еще не запланировано
if (! wp_next_scheduled('wps_daily_delete_orders')) {
wp_schedule_event(time(), 'daily', 'wps_daily_delete_orders');
}Если вы используете кастомный статус, например archived, замените 'status' => 'completed' на 'status' => 'archived'.
Проверка результата после внедрения
Чтобы проверить, что удаление работает:
- Создайте тестовый заказ и переведите его в нужный статус (например,
completed). - Измените дату заказа в базе (через SQL) на дату старше 30 дней, например:
UPDATE wp_posts SET post_date = '2023-01-01 00:00:00', post_date_gmt = '2023-01-01 00:00:00' WHERE ID = 123;- Запустите событие вручную, например через WP-CLI:
wp cron event run wps_daily_delete_orders- Убедитесь, что заказ удалён из админки и из базы (проверка через wp-admin и SQL).
Частые ошибки и как исправить
- Заказы не удаляются: Возможно, событие WP-Cron не запускается. Проверьте, работает ли WP-Cron на сайте. Для теста можно вызвать функцию удаления вручную.
- Неверный статус заказа: Убедитесь, что статус, указанный в запросе, действительно используется на сайте. Поищите кастомные статусы в настройках или в коде.
- Отсутствие прав на удаление: Функция
wp_delete_postс параметромtrueудаляет пост полностью. Если по каким-то причинам удаление блокируется, проверьте роли и права пользователя, под которым выполняется код. - Большая нагрузка при удалении: При большом количестве заказов удаляйте партиями, чтобы избежать таймаута. Добавьте лимит и пагинацию.
Оптимизация и безопасность при удалении заказов
- Резервное копирование: Перед автоматическим удалением любых данных обязательно настройте резервное копирование базы.
- Удаление партиями: Для больших магазинов ограничьте количество удаляемых заказов за один запуск, например
'limit' => 50, и используйте повторный запуск события. - Логирование: Добавьте логирование удалённых заказов для аудита и отладки.
- Защита от случайных удалений: Добавьте проверку на мета-данные или дополнительные условия, чтобы точно удалять только ненужные заказы.
Сравнение вариантов автоматического удаления заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + кастомный код | Через wp_schedule_event и wc_get_orders удалять заказы по статусу и дате | Гибко, без сторонних плагинов, можно точно настроить | Нужно писать и тестировать код, зависит от правильной работы WP-Cron |
| Плагин очистки базы | Готовые решения для удаления старых заказов и ревизий | Простота установки, поддержка обновлений | Может удалять слишком много, не всегда гибко под кастомные статусы |
| SQL скрипты в cron на сервере | Запуск SQL запросов напрямую на базе | Максимальная скорость и контроль | Риск ошибок, требует навыков работы с SQL и доступа к серверу |