Диагностика проблемы: зачем удалять неактивные заказы в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается множество заказов со статусами, такими как "Ожидает оплаты" или "Отменен". Они занимают место в базе данных, замедляют работу административной панели и могут мешать аналитике. Автоматическое удаление таких заказов по истечении заданного срока позволяет поддерживать базу в порядке без ручного вмешательства.
Как настроить автоматическое удаление неактивных заказов по срокам
Выбор статусов заказов для удаления
Прежде всего, нужно определить, какие статусы заказов считать неактивными и подлежащими удалению. Обычно это:
pending— ожидает оплаты;failed— неудачный платеж;cancelled— отменен.
Заказы со статусом completed или processing обычно сохраняются.
Пошаговое решение с примером кода
Добавьте следующий код в файл functions.php вашей дочерней темы или в плагин для кастомных функций:
function wpsocial_delete_old_inactive_orders() {
if ( ! class_exists( 'WC_Order_Query' ) ) {
return;
}
$statuses = array( 'pending', 'failed', 'cancelled' ); // Статусы для удаления
$days = 30; // Срок хранения заказов в днях
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$query = new WC_Order_Query( array(
'limit' => -1,
'status' => $statuses,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
) );
$order_ids = $query->get_orders();
if ( ! empty( $order_ids ) ) {
foreach ( $order_ids as $order_id ) {
wp_trash_post( $order_id ); // Помещаем заказ в корзину
// Для полного удаления используйте wp_delete_post($order_id, true);
}
}
}
// Запускаем функцию раз в сутки с помощью WP Cron
add_action( 'wpsocial_daily_order_cleanup', 'wpsocial_delete_old_inactive_orders' );
// Планируем событие при активации темы/плагина
function wpsocial_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpsocial_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpsocial_daily_order_cleanup' );
}
}
add_action( 'wp', 'wpsocial_schedule_order_cleanup' );
// Очищаем расписание при деактивации
function wpsocial_unschedule_order_cleanup() {
$timestamp = wp_next_scheduled( 'wpsocial_daily_order_cleanup' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpsocial_daily_order_cleanup' );
}
}
// Добавьте это в деактивацию плагина или темы
// register_deactivation_hook( __FILE__, 'wpsocial_unschedule_order_cleanup' );Объяснение кода
- Используем класс
WC_Order_Queryдля выборки заказов по статусам и дате создания; - Удаляем заказы, которые старше 30 дней (значение можно изменить в переменной
$days); - Для удаления используем
wp_trash_post, чтобы можно было восстановить заказ из корзины при необходимости; - Планируем ежедневное выполнение задачи с помощью WP Cron.
Проверка результата после внедрения
- Создайте тестовый заказ с нужным статусом (например,
pending) и датой создания более 30 дней назад. Для этого можно вручную изменить дату создания в базе данных или использовать плагин для редактирования заказов; - Запустите запланированное событие вручную через WP-CLI:
wp cron event run wpsocial_daily_order_cleanup; - Проверьте, что заказ переместился в корзину (раздел "Заказы" -> "Корзина" в WooCommerce);
- Если хотите удалить навсегда, замените
wp_trash_postнаwp_delete_postв коде.
Частые ошибки и как их исправить
- Код не выполняется: Убедитесь, что WP Cron работает на вашем сервере. Для отладки можно использовать плагин WP Crontrol;
- Удаляются нужные заказы: Проверьте переменную
$statuses— не включайте статусы, которые должны сохраняться; - Заказы не удаляются, хотя старше срока: Проверьте правильность формата даты и время сервера;
- Удаление без возможности восстановления: Используйте
wp_trash_post, чтобы сначала перемещать заказы в корзину, а не удалять навсегда.
Практические советы по безопасности и производительности
- Не удаляйте заказы сразу навсегда — сначала перемещайте их в корзину. Это безопаснее;
- Для больших магазинов с тысячами заказов используйте пакетную обработку, чтобы избежать превышения лимита памяти или времени выполнения;
- Проверяйте нагрузку на базу, планируя выполнение скрипта в ночное время;
- Регулярно делайте резервные копии базы перед автоматическими удалениями;
- Можно дополнительно логировать удаленные заказы, например, записывать ID и дату удаления в отдельный файл или таблицу.
Сравнение способов удаления неактивных заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код на WP Cron (пример выше) | Автоматическое удаление заказов по расписанию | Гибкость, нет необходимости в плагинах, можно кастомизировать | Требует навыков программирования, зависит от работы WP Cron |
| Плагины очистки базы | Готовые решения для удаления старых заказов | Простота настройки, визуальный интерфейс | Могут быть тяжелыми, не всегда гибкие, риск удаления лишнего |
| Ручное удаление через админку | Удаление заказов вручную | Безопасно, полный контроль | Трудоемко, не подходит для большого количества заказов |