Диагностика проблемы: зачем удалять закрытые заказы автоматически
В интернет-магазинах на WooCommerce количество заказов со статусом completed или cancelled может расти, занимая место в базе данных и замедляя её работу. Особенно это актуально для магазинов с большим потоком заказов. Ручное удаление заказов неудобно и неэффективно. Автоматизация процесса с помощью WP-Cron позволяет регулярно очищать базу от устаревших заказов, улучшая производительность.
Как работает WP-Cron для автоматизации задач в WordPress
WP-Cron — внутренний планировщик задач WordPress, который запускается при посещении сайта. Он позволяет выполнять произвольные функции по расписанию, например, удалять старые заказы WooCommerce.
Основные моменты:
- WP-Cron не зависит от системного cron, но менее точен;
- Настраивается через хуки и функции;
- Для более надёжной работы можно настроить системный cron, который будет запускать WP-Cron;
- В нашем случае задача будет запускаться раз в сутки.
Пошаговое решение: автоматическое удаление заказов WooCommerce со статусом completed старше 30 дней
1. Создаём функцию удаления заказов
function wpm_delete_old_completed_orders() {
$days = 30; // количество дней
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'status' => 'completed',
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
// Получаем ID заказов
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // удаляем заказ без возможности восстановления
}
}2. Регистрируем событие WP-Cron
function wpm_schedule_order_cleanup() {
if (!wp_next_scheduled('wpm_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpm_daily_order_cleanup');
}
}
add_action('wp', 'wpm_schedule_order_cleanup');3. Подключаем функцию к крону
add_action('wpm_daily_order_cleanup', 'wpm_delete_old_completed_orders');4. Добавляем возможность сброса задачи при деактивации плагина (если код в плагине)
function wpm_clear_scheduled_order_cleanup() {
$timestamp = wp_next_scheduled('wpm_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpm_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpm_clear_scheduled_order_cleanup');Проверка результата после внедрения
Чтобы убедиться, что код работает:
- В базе данных wp_posts должны исчезнуть заказы со статусом
completed, созданные более 30 дней назад (post_type =shop_order); - Можно временно изменить интервал на
hourlyи проверить удаление через час; - Для отладки используйте плагин WP Crontrol — он покажет запланированные задачи и позволит запускать их вручную;
- В логах сервера или через функцию
error_logможно выводить количество удалённых заказов.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что функция
wpm_delete_old_completed_ordersвызывается, используйтеerror_logвнутри функции для отладки. - WP-Cron не срабатывает: На низкосерверных хостингах или при отсутствии трафика WP-Cron может не запускаться. Рекомендуется настроить системный cron для вызова
wp-cron.php. - Удаляются не те заказы: Проверьте правильность условий в
wc_get_orders, особенно параметрdate_createdиstatus. - Потеря важных данных: Убедитесь, что удалять нужно именно заказы со статусом
completedилиcancelled, а не активные.
Практические советы по безопасности и производительности
- Удаление заказов — необратимая операция. Рекомендуется делать резервные копии базы перед запуском кода.
- Не удаляйте заказы с покупателями, которые могут понадобиться для бухгалтерии или аналитики.
- Для крупных магазинов с десятками тысяч заказов лучше запускать удаление частями (пагинация), чтобы избежать тайм-аутов.
- Для повышения надёжности используйте системный cron для вызова WP-Cron:
wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - Если используется плагин Clearfy Pro от WPShop, можно дополнительно оптимизировать базу данных и настроить автоматическую чистку.
Чек-лист для внедрения автоматического удаления заказов в WooCommerce
- Добавить функцию удаления старых заказов с нужным статусом.
- Зарегистрировать cron-событие для запуска функции.
- Проверить работу запланированной задачи через WP Crontrol или аналог.
- Настроить системный cron для вызова WP-Cron (рекомендуется).
- Создать резервную копию базы данных.
- Запустить удаление и проверить базу.
- Мониторить логи и корректировать функцию при необходимости.