Почему важно удалять неактивные заказы в WooCommerce
В WooCommerce накапливаются заказы со статусами, которые не были завершены покупателем: ожидающие оплаты, отменённые, просроченные. Они занимают место в базе данных, замедляют запросы и усложняют работу с отчётами. Регулярное удаление таких заказов помогает поддерживать магазин в оптимальном состоянии.
Диагностика проблемы: как определить неактивные заказы
Для начала нужно понять, какие заказы считаются неактивными и как их найти:
wc-pending— заказы, ожидающие оплаты;wc-cancelled— отменённые вручную или системой;wc-failed— неудачные платежи;wc-on-hold— заказ поставлен на удержание, но не обработан долгое время.
Выберите статусы и период, например, удалить заказы старше 30 дней с этими статусами.
Пошаговое решение с использованием WP-Cron
1. Создание функции для удаления заказов
Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код:
function wpb_delete_old_inactive_orders() {
$days = 30; // Период в днях
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'status' => array('pending', 'cancelled', 'failed', 'on-hold'),
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}
}2. Регистрация и запуск WP-Cron задачи
Добавьте код для создания задачи, которая будет запускаться ежедневно:
function wpb_schedule_inactive_orders_cleanup() {
if (!wp_next_scheduled('wpb_daily_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_cleanup_hook');
}
}
add_action('wp', 'wpb_schedule_inactive_orders_cleanup');
add_action('wpb_daily_cleanup_hook', 'wpb_delete_old_inactive_orders');3. Удаление задачи при деактивации плагина или темы
Чтобы избежать накопления ненужных задач, добавьте очистку при деактивации:
function wpb_clear_scheduled_cleanup() {
$timestamp = wp_next_scheduled('wpb_daily_cleanup_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpb_daily_cleanup_hook');
}
}
register_deactivation_hook(__FILE__, 'wpb_clear_scheduled_cleanup');Проверка результата после внедрения
- Перейдите в WooCommerce - Заказы и отфильтруйте по статусам
pending,cancelled,failed,on-holdза период старше 30 дней. Заказы должны отсутствовать или значительно уменьшиться. - Для теста можете временно уменьшить период в функции удаления до 1 дня и проверить, удалятся ли старые заказы.
- Проверьте логи сервера на наличие ошибок при выполнении WP-Cron.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: Проверьте, что на сайте есть трафик или настройте системный cron для вызова
wp-cron.php. - Заказы не удаляются: Проверьте права пользователя, под которым запускается PHP, и убедитесь, что в функции
wp_delete_postуказан параметрtrueдля полной очистки. - Удаляются ненужные заказы: Проверьте фильтр статусов и даты в аргументах
wc_get_orders. Возможно, стоит добавить дополнительную проверку.
Практические советы по безопасности и производительности
- Не запускайте удаление заказов слишком часто, чтобы не создавать нагрузку на базу.
- Перед удалением заказывайте резервное копирование базы данных.
- Используйте функцию
wp_delete_postс параметромtrue, чтобы полностью удалить связанные данные, включая метаданные и файлы. - Логируйте работу задачи, чтобы отслеживать количество удалённых заказов и возможные ошибки.
Сравнение вариантов удаления неактивных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, не требует кода | Трудоёмко, не подходит для большого количества заказов |
| Плагин для очистки заказов | Удобство, часто с настройками и логами | Дополнительная нагрузка, может конфликтовать с другими плагинами |
| Автоматизация через WP-Cron и кастомный код | Гибкость, нет зависимости от сторонних плагинов, можно тонко настроить | Требуются навыки разработки, возможные проблемы с WP-Cron |