Диагностика проблемы: накопление старых заказов в WooCommerce
В магазинах на WooCommerce часто возникает необходимость очищать базу от старых заказов со статусами cancelled и completed, особенно если они не нужны для отчетности или занимают слишком много места. Ручное удаление через админку неудобно и трудозатратно, а автоматизация позволяет поддерживать базу в порядке и улучшить производительность.
Как настроить автоматическое удаление заказов WooCommerce по статусу и времени
Рассмотрим пример, когда нужно удалять заказы со статусом cancelled и completed, которым больше 90 дней.
Шаг 1. Создаём функцию для удаления заказов
function wpdev_delete_old_orders() {
$statuses = array('cancelled', 'completed');
$days_threshold = 90;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_threshold} days"));
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
'no_found_rows' => true,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // помещаем заказ в корзину
// wp_delete_post($order_id, true); // для полного удаления без корзины
}
}
}
}Шаг 2. Запускаем функцию по расписанию (WP-Cron)
Добавим ежедневное событие для автоматического удаления заказов.
function wpdev_schedule_order_cleanup() {
if (!wp_next_scheduled('wpdev_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpdev_daily_order_cleanup');
}
}
add_action('wp', 'wpdev_schedule_order_cleanup');
add_action('wpdev_daily_order_cleanup', 'wpdev_delete_old_orders');Шаг 3. Регистрируем деактивацию для очистки WP-Cron
function wpdev_unschedule_order_cleanup() {
$timestamp = wp_next_scheduled('wpdev_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdev_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpdev_unschedule_order_cleanup');Проверка результата после внедрения
- Запустите функцию вручную через
wpdev_delete_old_orders()в консолиWP-CLIили временно добавьте вызов вfunctions.phpи проверьте, что заказы старше 90 дней перемещаются в корзину. - Проверьте наличие запланированного события WP-Cron через плагин WP Crontrol или команду
wp cron event list. - Наблюдайте, что ежедневно заказы с соответствующими статусами и датами автоматически очищаются.
Частые ошибки и их исправление
- Заказы не удаляются: проверьте, что статусы указаны с префиксом
wc-вpost_statusзапроса. - Функция не запускается по расписанию: убедитесь, что WP-Cron работает, или настройте системный cron для вызова
wp-cron.php. - Удаление не полное:
wp_trash_post()перемещает заказ в корзину, для полного удаления используйтеwp_delete_post($order_id, true). - Перегрузка базы при большом количестве заказов: добавьте пагинацию в запрос, например, по 100 заказов за раз, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Не удаляйте заказы сразу, лучше перемещайте их в корзину, чтобы была возможность восстановления.
- Добавьте логирование удаления в файл или метаданные для аудита.
- Ограничьте количество заказов, обрабатываемых за один запуск, используя параметр
posts_per_pageи смещением (offset). - Для больших магазинов используйте WP-CLI задачи для удаления заказов вне WP-Cron.
Сравнение методов удаления заказов WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, визуально контролируемо | Трудозатратно, не автоматизировано |
| WP-Cron с пользовательским кодом | Автоматизация, гибкость, можно настроить фильтры | Зависит от активности сайта, может не запускаться при низком трафике |
| WP-CLI скрипты | Быстро и эффективно, не зависит от WP-Cron | Требует доступа к серверу и навыков работы с консолью |
| Плагины для очистки заказов | Удобный интерфейс, готовые решения | Могут быть избыточными, влиять на производительность |