Диагностика проблемы: зачем удалять неактивные заказы в WooCommerce
Неактивные заказы (статусы "ожидание оплаты", "отменён", "в обработке" без движения) могут накапливаться в базе данных WooCommerce, замедляя работу административной панели и увеличивая размер базы. Это особенно актуально для магазинов с большим потоком заказов.
Для начала определите, есть ли проблема с "засорением" заказов:
- Перейдите в WooCommerce > Заказы и отфильтруйте заказы по статусу, например, "ожидание оплаты".
- Посмотрите, сколько заказов в таких статусах старше 30 дней.
- Оцените, насколько это влияет на скорость загрузки страниц админки и запросов к базе.
Пошаговое решение: скрипт автоматического удаления неактивных заказов
Самый надёжный способ — написать кастомный PHP-скрипт, который будет удалять заказы с определёнными статусами и старше заданного срока. Для автоматизации используйте wp-cron.
Шаг 1. Создание функции удаления заказов
function wppartner_delete_old_inactive_orders() {
if ( ! class_exists( 'WC_Order_Query' ) ) {
return;
}
// Параметры: заказы со статусом 'pending' или 'failed', старше 30 дней
$args = array(
'limit' => -1,
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - 30 * DAY_IN_SECONDS ),
'return' => 'ids',
);
$order_query = new WC_Order_Query( $args );
$orders_to_delete = $order_query->get_orders();
if ( empty( $orders_to_delete ) ) {
return;
}
foreach ( $orders_to_delete as $order_id ) {
wp_delete_post( $order_id, true ); // жёсткое удаление
}
}Шаг 2. Регистрация планировщика WP-Cron
function wppartner_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wppartner_order_cleanup_event' ) ) {
wp_schedule_event( time(), 'daily', 'wppartner_order_cleanup_event' );
}
}
add_action( 'wp', 'wppartner_schedule_order_cleanup' );
add_action( 'wppartner_order_cleanup_event', 'wppartner_delete_old_inactive_orders' );Шаг 3. Добавьте код в файл functions.php вашей дочерней темы или в кастомный плагин
Это обеспечит ежедневный автоматический запуск очистки заказов.
Проверка результата после внедрения
- В админке WooCommerce перейдите в раздел заказов и отфильтруйте статусы 'pending' и 'failed'.
- Проверьте, что заказы старше 30 дней исчезли.
- Для теста можно временно изменить период очистки в коде на 1 день (заменить 30 на 1) и создать тестовые заказы с нужным статусом.
- Проверьте логи сервера на ошибки удаления, если они есть.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что в WooCommerce подключен класс
WC_Order_Query, и что хукиwpиwppartner_order_cleanup_eventработают. - Удаляются нужные заказы: внимательно настройте фильтр по статусам и дате, чтобы исключить активные заказы.
- Планировщик WP-Cron не запускается: на некоторых хостингах WP-Cron требует внешнего вызова. Проверьте с помощью плагина WP Crontrol.
- Падение производительности при большом числе удалений: ограничьте количество удаляемых заказов за один запуск, например,
'limit' => 50, чтобы избежать тайм-аутов.
Практические советы по безопасности и производительности
- Используйте жёсткое удаление
wp_delete_post(..., true)только если уверены, что данные не понадобятся для отчетов. - Перед удалением создавайте резервные копии базы данных.
- Для крупных магазинов рассмотрите удаление по частям с использованием offset или пагинации.
- Соблюдайте правильные права доступа к коду, чтобы исключить возможность несанкционированного запуска функции удаления.
Таблица сравнения способов удаления неактивных заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Трудоёмко, не подходит для больших объемов | WooCommerce > Заказы |
| Кастомный скрипт + WP-Cron | Автоматизация, гибкость настроек | Требует навыков PHP, возможны ошибки без тестирования | Код из статьи |
| Плагины очистки базы (например, Clearfy Pro) | Простота, дополнительные функции оптимизации | Зависимость от стороннего ПО, возможные конфликты | Clearfy Pro |