Диагностика проблемы: зачем удалять просмотренные заказы автоматически
В интернет-магазинах на WooCommerce накопление большого количества заказов со статусом "завершён" или "обработан" может замедлить работу базы данных и усложнить администрирование. Особенно это актуально при высоком трафике и большом объёме заказов. Автоматическое удаление таких заказов по расписанию позволяет поддерживать базу в оптимальном состоянии без ручного вмешательства.
Как настроить автоматическое удаление просмотренных заказов через wp_cron
Основные шаги решения
- Создать функцию, которая будет удалять заказы с нужным статусом и старше определённого времени.
- Добавить хук для запуска этой функции по расписанию с помощью WP-Cron.
- Настроить расписание через фильтр
cron_schedules, если нужны нестандартные интервалы. - Активировать событие при инициализации WordPress.
Пример кода для functions.php или собственного плагина
function wps_remove_old_completed_orders() {
// Получаем дату 30 дней назад
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
// Получаем ID заказов со статусом completed старше 30 дней
$args = array(
'status' => 'completed',
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Отправляем заказ в корзину (можно заменить на wp_delete_post для полного удаления)
}
}
}
// Добавляем расписание - раз в день
add_filter('cron_schedules', function($schedules) {
if(!isset($schedules['daily'])) {
$schedules['daily'] = array(
'interval' => 86400, // 24 часа
'display' => __('Once Daily')
);
}
return $schedules;
});
// Регистрируем событие при активации темы/плагина
function wps_schedule_order_cleanup() {
if (!wp_next_scheduled('wps_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wps_daily_order_cleanup');
}
}
add_action('wp', 'wps_schedule_order_cleanup');
// Привязываем функцию к событию
add_action('wps_daily_order_cleanup', 'wps_remove_old_completed_orders');
Как проверить, что автоматическое удаление работает
- Проверьте список заказов в WooCommerce — заказы старше 30 дней со статусом "завершён" должны быть удалены или перемещены в корзину.
- Для ручного теста вызовите функцию
wps_remove_old_completed_orders()напрямую, например, временно Добавьтеadd_action('init', 'wps_remove_old_completed_orders');и обновите сайт. - Проверьте журнал задач WP-Cron через плагин "WP Crontrol" — должно быть событие
wps_daily_order_cleanupс последним запуском.
Частые ошибки и как их исправить
- Заказы не удаляются: убедитесь, что статус заказа указан правильно в
wc_get_orders, например, 'completed', а не 'processing' или другой. - Задача WP-Cron не запускается: на некоторых хостингах WP-Cron зависит от посещений сайта. Для стабильной работы настройте системный cron или используйте плагин "WP Crontrol" для ручного запуска.
- Удаление слишком быстрое или не полное: функция использует
wp_trash_post, заказы попадают в корзину. Для полного удаления используйтеwp_delete_post($order_id, true);, но будьте осторожны — данные будут безвозвратно удалены.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Для больших магазинов разбивайте удаление на партии, например, по 50 заказов за один запуск, чтобы избежать таймаута.
- Используйте
wp_trash_postвместо полного удаления, чтобы иметь возможность восстановить ошибочно удалённые заказы. - Регулярно проверяйте состояние WP-Cron и логи ошибок для своевременного выявления проблем.
Чек-лист настройки автоматического удаления заказов в WooCommerce
- Определить статус заказов для удаления (например, completed)
- Выбрать возраст заказов для удаления (например, старше 30 дней)
- Реализовать функцию удаления с использованием
wc_get_ordersиwp_trash_post - Добавить событие wp_cron для запуска задачи по расписанию
- Проверить наличие и выполнение события в WP-Cron
- Тестировать на тестовом сайте перед применением на боевом
- Настроить резервное копирование базы данных
Сравнение подходов: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WP Bulk Delete) | Готовый интерфейс, удобство настройки, поддержка | Нагрузка, возможные конфликты, ограниченная кастомизация |
| Код (через wp_cron) | Максимальный контроль, минимальная нагрузка, гибкость | Требует навыков, риск ошибок при неправильной реализации |