Диагностика проблемы: зачем и когда удалять отменённые и возвращённые заказы
В больших магазинах на WooCommerce с тысячами заказов быстро растёт база данных, что замедляет сайт и усложняет управление заказами. Отменённые и возвращённые заказы, как правило, не нужны в активной базе после определённого срока, но WooCommerce не удаляет их автоматически. Их накопление увеличивает нагрузку, затрудняет аналитику и резервное копирование.
Проверить количество таких заказов можно в базе, например, через phpMyAdmin, выполнив запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-refunded');
Если количество превышает несколько тысяч, стоит подумать об автоматизации удаления.
Пошаговое решение: как автоматически удалять отменённые и возвращённые заказы через WP-Cron
1. Регистрация крон-задачи
Добавьте в functions.php вашей темы или в кастомный плагин следующий код для создания задачи, которая будет запускаться ежедневно:
if ( ! wp_next_scheduled( 'wc_auto_delete_cancelled_refunded_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wc_auto_delete_cancelled_refunded_orders' );
}
2. Функция удаления заказов
Реализуем функцию, которая будет удалять заказы старше 30 дней со статусом отменён или возвращён:
add_action( 'wc_auto_delete_cancelled_refunded_orders', 'wc_delete_old_cancelled_refunded_orders' );
function wc_delete_old_cancelled_refunded_orders() {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-refunded'],
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
];
$orders = get_posts( $args );
if ( ! empty( $orders ) ) {
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // Полное удаление без перемещения в корзину
}
}
}
3. Очистка крон-задачи при деактивации плагина или темы
Рекомендуется убрать крон-задачу при деактивации, чтобы не оставлять мусор:
register_deactivation_hook( __FILE__, function() {
$timestamp = wp_next_scheduled( 'wc_auto_delete_cancelled_refunded_orders' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wc_auto_delete_cancelled_refunded_orders' );
}
});
Проверка результата после внедрения
- Выполните вручную запуск крон-задачи через WP-CLI:
wp cron event run wc_auto_delete_cancelled_refunded_ordersили вызовите функцию напрямую. - Проверьте в админке WooCommerce раздел заказов: отменённые и возвращённые, старше 30 дней, должны исчезнуть.
- В базе данных убедитесь, что заказы с post_status 'wc-cancelled' и 'wc-refunded', датированные более 30 дней назад, удалены (см. SQL-запрос в разделе диагностики).
- Просмотрите логи ошибок PHP (при наличии) на предмет проблем с удалением.
Частые ошибки и как их исправить
- Удаление не происходит: Проверьте, что WP-Cron работает на вашем хостинге. Для теста запустите cron вручную через WP-CLI.
- Заказы не удаляются полностью: Функция
wp_delete_postс параметромtrueудаляет заказ без перемещения в корзину. Если параметр отсутствует илиfalse, заказы останутся в корзине. - Выполнение занимает слишком много времени: При большом количестве заказов разбейте удаление на партии по 100-200 заказов, используя параметр
posts_per_page. - Удаляются нужные заказы: Проверьте условия выборки и дату в
date_query, чтобы не удалить свежие или важные заказы.
Практические советы по безопасности и производительности
- Сделайте резервную копию базы перед внедрением автоматического удаления.
- Добавьте журналирование удалённых заказов для аудита, например, через запись в лог файл или отдельную таблицу.
- Для больших магазинов используйте WP-CLI скрипты для пакетного удаления без нагрузки на сайт.
- Оптимизируйте таблицы базы данных после удаления заказов с помощью
OPTIMIZE TABLE wp_posts. - Используйте транзакции, если работаете с кастомными таблицами и метаданными заказов.
Сравнение подходов: плагин vs. кастомный код
| Критерий | Плагин | Кастомный код |
|---|---|---|
| Гибкость | Ограничена функционалом плагина | Полный контроль над логикой и условиями удаления |
| Производительность | Может быть избыточен, загружает лишними функциями | Оптимизирован под конкретную задачу |
| Безопасность | Зависит от качества плагина | Можно внедрить собственные проверки и логи |
| Поддержка и обновления | Есть поддержка разработчика | Требует самостоятельного сопровождения |
| Внедрение | Быстрое, без кода | Требует навыков PHP и тестирования |