Диагностика проблемы: зачем удалять возвращённые и отменённые заказы
В магазинах на WooCommerce с большим количеством возвратов и отмен заказов база данных быстро разрастается. Это замедляет работу сайта, усложняет отчёты и увеличивает нагрузку на сервер. Сам WooCommerce не удаляет такие заказы автоматически, а только меняет их статус на "refunded" (возвращён) или "cancelled" (отменён).
Если не чистить эти заказы регулярно, таблица wp_posts и связанные с ней wp_postmeta будут содержать тысячи записей, которые не нужны для текущей работы магазина.
Как понять, что проблема есть:
- Медленная работа панели заказов в WooCommerce
- Большой размер таблицы
wp_posts(миллионы записей) - Отчёты WooCommerce показывают много заказов с статусом "refunded" и "cancelled", которые вы не планируете анализировать
Пошаговое решение: автоматическое удаление заказов по статусу
Используем WP Cron для периодического запуска кода, который удалит заказы с нужными статусами старше определённого срока.
1. Добавление функции удаления заказов
function wpguest_delete_old_cancelled_refunded_orders() {
// Установим лимит по дате, например, удалять заказы старше 30 дней
$date_limit = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-refunded'),
'date_query' => array(
array(
'before' => $date_limit,
'inclusive' => true,
),
),
'posts_per_page' => 100, // ограничение на партию
'fields' => 'ids',
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true — без перемещения в корзину
}
}
}2. Регистрация задачи в WP Cron
function wpguest_schedule_order_cleanup() {
if (!wp_next_scheduled('wpguest_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpguest_daily_order_cleanup');
}
}
add_action('wp', 'wpguest_schedule_order_cleanup');
add_action('wpguest_daily_order_cleanup', 'wpguest_delete_old_cancelled_refunded_orders');3. Удаление задачи при деактивации темы или плагина
function wpguest_clear_scheduled_order_cleanup() {
$timestamp = wp_next_scheduled('wpguest_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpguest_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpguest_clear_scheduled_order_cleanup');Проверка результата после внедрения
- Подключитесь к базе данных через phpMyAdmin или через админку хостинга, проверьте количество заказов с
post_status"wc-cancelled" и "wc-refunded" до и после запуска cron. - В WooCommerce > Заказы убедитесь, что старые отменённые и возвращённые заказы исчезли.
- В админке WordPress выполните вручную функцию через вызов в плагине Code Snippets или временно добавьте вызов
wpguest_delete_old_cancelled_refunded_orders();в functions.php, чтобы проверить удаление сразу.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP Cron работает на сайте. Для этого можно использовать плагин WP Crontrol. Если WP Cron отключён, задача не запустится.
- Удаляются не те заказы: Убедитесь, что в массиве
post_statusстоят правильные статусы с префиксомwc-. Например, "cancelled" — это "wc-cancelled". - Превышение лимита по памяти или времени выполнения: уменьшите параметр
posts_per_pageили используйте пакетную обработку с временными паузами. - Удаление заказов приводит к потере данных: Сделайте резервную копию базы перед запуском кода.
Практические советы по безопасности и производительности
- Запускайте удаление не чаще раза в сутки, чтобы не нагружать сервер.
- Добавьте логирование удалённых заказов в отдельный файл для аудита, например:
function wpguest_log_deleted_order($order_id) {
error_log('Deleted order ID: ' . $order_id);
}Вызовите wpguest_log_deleted_order($order_id); внутри цикла удаления.
- Для больших магазинов с миллионами заказов рекомендуем делать удаление пакетами с лимитом и запускать задачу несколько раз с интервалом.
- Ограничьте права пользователя, который добавляет этот код, чтобы избежать случайного удаления.
Сравнение методов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Удаление через WP Cron и код | Автоматизация, точечное удаление по статусу и дате, гибкость | Нужно контролировать работу WP Cron, требует базовых навыков PHP |
| Удаление вручную через админку | Простота, не требует кода | Трудоёмко при большом объёме заказов, риск пропуска |
| Плагины очистки WooCommerce | Удобство, готовые решения, дополнительные функции (оптимизация) | Нагрузка на сайт, возможные конфликты, лицензии |