Проблема: Зачем автоматизировать удаление отменённых и возвращённых заказов в WooCommerce
В интернет-магазине на WooCommerce с большим потоком заказов отменённые и возвращённые заказы накапливаются в базе, увеличивая её размер и замедляя работу админки и отчётов. Ручное удаление таких заказов неудобно и занимает время, особенно если заказов тысячи.
Диагностика проблемы и подготовка
Для начала нужно определить, сколько заказов с определёнными статусами есть в вашей базе. Используйте SQL-запрос в phpMyAdmin или аналоге:
SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded') GROUP BY post_status;Если количество заказов с статусами wc-cancelled и wc-refunded растёт и занимает существенную часть базы, стоит автоматизировать очистку.
Пошаговое решение: как автоматически удалять отменённые и возвращённые заказы
1. Создаём пользовательскую функцию для удаления заказов
Добавьте следующий код в functions.php вашей дочерней темы или в отдельный плагин:
function wpguest_delete_old_cancelled_refunded_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-refunded'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago', // Удалять заказы старше 30 дней
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — полное удаление
}
}
}2. Автоматизируем запуск функции через WP-Cron
Добавьте планировщик, который будет запускать очистку раз в сутки:
if (!wp_next_scheduled('wpguest_daily_cleanup_cancelled_refunded')) {
wp_schedule_event(time(), 'daily', 'wpguest_daily_cleanup_cancelled_refunded');
}
add_action('wpguest_daily_cleanup_cancelled_refunded', 'wpguest_delete_old_cancelled_refunded_orders');3. Опционально: добавьте очистку транзиентов и кеша после удаления
Если используете кеш или транзиенты, очистите их, чтобы обновить данные:
function wpguest_cleanup_cache_after_order_delete() {
// Пример для очистки транзиентов WooCommerce
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_wc_%'");
}
add_action('wpguest_daily_cleanup_cancelled_refunded', 'wpguest_cleanup_cache_after_order_delete');Проверка результата после внедрения
- После первого запуска крона проверьте наличие заказов с отменённым и возвращённым статусом старше 30 дней в админке WooCommerce.
- Запустите вручную функцию для проверки без ожидания cron, вызвав
wpguest_delete_old_cancelled_refunded_orders()через WP-CLI:
wp eval 'wpguest_delete_old_cancelled_refunded_orders();'- Проверьте таблицу
wp_postsна предмет удалённых записей. - Убедитесь, что в базе уменьшилось количество заказов с указанными статусами.
Частые ошибки и как их исправить
- Функция не запускается регулярно: Проверьте, работает ли WP-Cron на вашем хостинге. В некоторых случаях нужны внешние cron-задачи.
- Заказы не удаляются: Убедитесь, что статусы заказов указаны правильно с префиксом
wc-, и что датаpost_dateсоответствует дате создания заказа. - Удаляются не те заказы: Проверьте аргументы
date_queryиpost_statusв запросеget_posts. - Удаление затягивается или вызывает нагрузку: разбейте удаление на части, ограничив
posts_per_pageдо 100 и добавьте промежутки между пакетами.
Практические советы по безопасности и производительности
- Запускайте удаление в периоды низкой нагрузки, чтобы не замедлять сайт.
- Создавайте резервную копию базы перед внедрением автоматического удаления.
- Используйте
wp_delete_post($order_id, true)для полного удаления, включая метаданные и связи. - Если на сайте много заказов, рассмотрите использование WP-CLI для пакетной очистки.
- Проверяйте логи ошибок PHP и сервера на предмет проблем с памятью или таймаутов.
Сравнение способов удаления отменённых и возвращённых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Простой, не требует кода | Невозможно массово удалить старые заказы, трудозатратно |
| Автоматизация через WP-Cron и get_posts + wp_delete_post | Автоматически очищает базу, гибкость настроек | Зависит от корректной работы WP-Cron, требует тестирования |
| Использование плагинов очистки базы данных | Простота установки, дополнительные функции оптимизации | Может не иметь точных настроек под заказы WooCommerce |