Проблема: зачем удалять заказы после архивации в WooCommerce
В WooCommerce стандартного механизма удаления заказов после их архивирования нет. Однако на крупных интернет-магазинах накопление архивных заказов ведёт к раздуванию базы данных и замедлению работы сайта. Автоматическое удаление таких заказов помогает поддерживать базу в оптимальном состоянии без ручной работы.
Диагностика: как проверить, что заказы действительно архивируются
По умолчанию WooCommerce не имеет статуса "архивирован", но некоторые плагины или кастомные решения могут добавлять такой статус или помечать заказы через мета. Для начала нужно понять, как именно у вас реализована архивация заказов:
- Проверьте, существует ли пользовательский статус заказа, например
wc-archivedили похожий. - Если нет, определите мета-поле, которое отвечает за архивацию, например
_is_archived. - Для проверки используйте SQL-запрос к базе или REST API WooCommerce.
Пошаговое решение: автоматическое удаление заказов после архивации
1. Определяем критерий архивации
Для примера предположим, что у вас есть кастомный статус заказа archived. Если статус другой, замените его в коде.
2. Создаём cron-задачу для автоматического удаления
Добавим в functions.php или в собственный плагин следующий код:
function wc_delete_archived_orders() {
// Получаем заказы со статусом archived
$args = array(
'status' => 'archived',
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Перемещаем заказ в корзину, можно заменить на wp_delete_post для полного удаления
}
}
// Регистрируем cron событие, если оно ещё не зарегистрировано
if (!wp_next_scheduled('wc_delete_archived_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wc_delete_archived_orders_hook');
}
add_action('wc_delete_archived_orders_hook', 'wc_delete_archived_orders');3. Добавляем функцию для очистки корзины заказов (опционально)
Заказы в корзине не удаляются автоматически. Можно добавить периодическую очистку корзины заказов:
function wc_empty_orders_trash() {
global $wpdb;
$order_post_type = 'shop_order';
$query = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = 'trash'",
$order_post_type
);
$order_ids = $wpdb->get_col($query);
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
// Добавляем очистку корзины заказов раз в неделю
if (!wp_next_scheduled('wc_empty_orders_trash_hook')) {
wp_schedule_event(time(), 'weekly', 'wc_empty_orders_trash_hook');
}
add_action('wc_empty_orders_trash_hook', 'wc_empty_orders_trash');Проверка результата после внедрения
- Убедитесь, что заказы с нужным статусом удаляются после запуска cron. Для теста можно вручную вызвать функцию
wc_delete_archived_orders()через консоль WP-CLI или добавить временный вызов в код. - Проверьте наличие заказов с этим статусом в админке WooCommerce — они должны исчезнуть или перейти в корзину.
- Проверьте таблицу
wp_postsв базе данных для подтверждения удаления заказов.
Частые ошибки и как их исправить
- Неверный статус заказа: используйте функцию
wc_get_order_statuses()для просмотра всех доступных статусов и убедитесь, что используете правильный. - Отсутствие cron-задачи: проверьте, что событие
wc_delete_archived_orders_hookзарегистрировано черезwp_next_scheduled(). Если нет, попробуйте вручную вызвать функцию или использовать плагин WP Crontrol для диагностики. - Заказы не удаляются полностью:
wp_trash_post()перемещает заказ в корзину, для полного удаления используйтеwp_delete_post($order_id, true). - Права пользователя: при вызове функций удаления убедитесь, что код запускается с достаточными правами, иначе удаление может не сработать.
Практические советы по безопасности и производительности
- Не удаляйте заказы сразу без резервного копирования — лучше сначала перемещать их в корзину.
- Если на сайте много заказов, делайте удаление пакетами (например, по 50 заказов за раз), чтобы избежать таймаутов.
- Используйте WP-Cron только на сайтах с регулярным трафиком, иначе настройте системный cron для запуска WP-Cron.
- Логируйте результаты удаления в отдельный файл или через системные логи для мониторинга.
Сравнение подходов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| wp_trash_post() | Безопасно, можно восстановить заказ | Заказы остаются в корзине, база не очищается полностью |
| wp_delete_post(true) | Полное удаление, освобождает место в базе | Нельзя восстановить, риск потери данных |
| Удаление через SQL-запрос | Максимальная скорость | Риск повреждения данных, требует аккуратности |