Диагностика проблемы: зачем и когда удалять заказы в WooCommerce
По умолчанию WooCommerce не предоставляет инструментов для массового удаления заказов по определённым критериям, например, по статусу или дате создания. Это приводит к накоплению устаревших или отменённых заказов, которые увеличивают размер базы данных и могут замедлять работу сайта.
Типичные сценарии:
- Удаление отменённых заказов старше 30 дней.
- Удаление просроченных заказов с неоплаченным статусом.
- Автоматическая очистка тестовых заказов после отладки магазина.
Пошаговое решение: удаление заказов по статусу и дате с помощью кода
1. Добавление регулярного CRON-задачи для очистки заказов
В functions.php вашей темы или в кастомном плагине добавьте следующий код для регистрации события, которое будет запускаться ежедневно:
if (!wp_next_scheduled('custom_delete_old_wc_orders')) {
wp_schedule_event(time(), 'daily', 'custom_delete_old_wc_orders');
}2. Основная функция удаления заказов
Создайте функцию, которая будет искать и удалять заказы с конкретным статусом и старше заданного количества дней. Пример ниже удаляет заказы со статусом "cancelled" старше 30 дней.
function custom_delete_old_wc_orders() {
$days = 30; // Количество дней
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'limit' => -1,
'status' => 'cancelled',
'date_created' => '<' . $date,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаление без возможности восстановления
}
}
}
add_action('custom_delete_old_wc_orders', 'custom_delete_old_wc_orders');3. Запуск функции вручную для теста
Для проверки работы функции вызовите её один раз вручную (например, через admin_init):
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['run_delete_orders'])) {
custom_delete_old_wc_orders();
wp_die('Удаление заказов выполнено.');
}
});После добавления этого кода перейдите по ссылке https://ваш-сайт/admin/?run_delete_orders=1 под админом, чтобы запустить удаление.
Проверка результата после внедрения
- В админке WooCommerce перейдите в раздел «Заказы» и отфильтруйте по статусу "отменённые".
- Проверьте, что заказы старше 30 дней удалены.
- В базе данных (таблица
wp_posts, типshop_order) убедитесь, что нужные заказы отсутствуют. - Для контроля можно временно добавить логирование в функцию:
error_log('Удалён заказ ID: ' . $order_id);Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что статус заказа указан правильно. Для проверки статусов используйте
wc_get_order_statuses(). - CRON-задача не запускается: Убедитесь, что WP-Cron работает. Для диагностики можно использовать плагин WP Crontrol.
- Удаление не полное:
wp_delete_postс параметромtrueудаляет пост полностью. Если заказ остаётся в базе, проверьте наличие плагинов, которые блокируют удаление. - Проблемы с правами доступа: Функция удаления должна запускаться от имени пользователя с правами администратора или через CRON без ограничений.
Практические советы по безопасности и производительности
- Удаление большого количества заказов за один раз может привести к таймауту. Рекомендуется реализовать пакетную обработку (порциями по 50-100 заказов).
- Регулярно создавайте резервные копии базы данных перед массовыми изменениями.
- Для повышения производительности используйте WP CLI команду для удаления заказов, если доступна серверная консоль:
wp post delete $(wp post list --post_type=shop_order --post_status=cancelled --date_query_column=post_date --date_query_before='30 days ago' --format=ids) --force- Если вы используете плагин Clearfy Pro от WPSHOP, он может помочь с очисткой базы и удалением неиспользуемых данных, интегрируя ваш процесс удаления заказов.
Сравнение способов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php + WP-Cron | Гибкость, автоматизация, не требует плагинов | Нужно тестировать, возможны ошибки при большом объёме |
| WP CLI | Очень быстрое удаление, подходит для больших объёмов | Требует доступа к серверу и знаний консоли |
| Плагин для очистки базы (например, Clearfy Pro) | Удобство, дополнительные функции оптимизации | Платные решения, меньшая гибкость в кастомизации |