Проблема: накопление отменённых и возвращённых заказов в WooCommerce
Магазины на WooCommerce часто сталкиваются с проблемой чрезмерного роста количества заказов со статусами cancelled и refunded. Это приводит к раздуванию базы данных, замедлению админ-панели и усложнению управления заказами. Автоматизация удаления таких заказов помогает поддерживать базу в чистоте и улучшает производительность.
Диагностика проблемы
Чтобы убедиться, что у вас есть много устаревших отменённых и возвращённых заказов, выполните простой SQL-запрос в базе данных:
SELECT COUNT(ID) AS total_cancelled FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';
SELECT COUNT(ID) AS total_refunded FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-refunded';Если количество таких заказов превышает несколько сотен, стоит задуматься об автоматическом удалении.
Пошаговое решение: автоматическое удаление заказов по статусу и дате
1. Создание функции удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpcontrol_delete_old_orders() {
$days_to_keep = 30; // Количество дней для хранения заказов
$statuses_to_delete = array('wc-cancelled', 'wc-refunded');
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));
foreach ($statuses_to_delete as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id);
}
}
}
}
2. Запуск функции по расписанию с помощью WP-Cron
Добавьте в тот же файл код для регистрации и запуска планировщика задач:
// Регистрация события при активации темы или плагина
if (!wp_next_scheduled('wpcontrol_delete_old_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpcontrol_delete_old_orders_event');
}
// Хук для запуска функции
add_action('wpcontrol_delete_old_orders_event', 'wpcontrol_delete_old_orders');
// Очистка планировщика при деактивации
function wpcontrol_deactivate_cleanup() {
wp_clear_scheduled_hook('wpcontrol_delete_old_orders_event');
}
register_deactivation_hook(__FILE__, 'wpcontrol_deactivate_cleanup');
Проверка результата после внедрения
1. Проверьте, что события запланированы через плагин WP Crontrol или через запрос SQL:
SELECT * FROM wp_options WHERE option_name LIKE '%cron%';2. После выполнения задачи (или запуска вручную через WP Crontrol) убедитесь, что количество заказов со статусами wc-cancelled и wc-refunded уменьшилось.
Частые ошибки и как их исправить
- Ошибка: Заказы не удаляются.
Причина: Неправильные статусы или крон-события не запускаются.
Решение: Проверьте, что статусы указаны с префиксомwc-, и активен WP-Cron (проверьте wp-config.php на наличиеDISABLE_WP_CRON). - Ошибка: Функция удаляет заказы слишком рано.
Причина: Неправильно установлено количество дней хранения.
Решение: Используйте константу или настройку для изменения$days_to_keep. - Ошибка: Память PHP заканчивается при удалении большого количества заказов.
Решение: Ограничьте количество заказов на один запуск, например, добавьте'posts_per_page' => 100и запустите функцию несколько раз.
Практические советы по безопасности и производительности
- Перед удалением заказов используйте функцию
wp_trash_post(), которая отправляет заказ в корзину, а не удаляет сразу. Это позволит восстановить данные при ошибке. - Для окончательного удаления из корзины можно настроить отдельный скрипт, который удалит заказы, находящиеся в корзине более 7 дней.
- Не увеличивайте частоту задачи чаще раза в сутки, чтобы не перегружать сайт.
- Для магазинов с большой базой данных рассмотрите использование WP CLI для пакетного удаления заказов.
Сравнение вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php + WP-Cron | Полный контроль, без сторонних плагинов | Требует навыков программирования и контроля крон задач |
| Плагины для очистки заказов (например, WP Bulk Delete) | Простота использования, интерфейс | Доп. нагрузка на сайт, ограниченный функционал под конкретные задачи |
| WP CLI | Высокая производительность, пакетная очистка | Требует SSH доступа и командной строки |