Почему важно удалять неоплаченные и отменённые заказы автоматически
Неоплаченные и отменённые заказы со временем накапливаются в базе данных WooCommerce, что приводит к раздуванию таблиц и замедлению работы админки и сайта в целом. Автоматическое удаление заказов по истечении заданного срока помогает поддерживать базу в порядке без лишних затрат времени на ручную очистку.
Диагностика проблемы: как понять, что нужно очищать заказы
- Проверьте количество заказов в админке WooCommerce — если оно значительно больше реального объёма продаж, скорее всего есть залежи неоплаченных или отменённых заказов.
- Используйте запрос к базе данных для подсчёта таких заказов:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-cancelled'); - Если количество заказов более 1000 и они не закрыты, база может ощутимо замедляться.
Пошаговое решение: как автоматически удалять неоплаченные и отменённые заказы по срокам
Шаг 1. Добавляем WP-Cron задачу для удаления заказов
В functions.php вашей темы или в кастомном плагине добавьте код, который будет запускать очистку заказов ежедневно:
add_action('wp', 'setup_daily_order_cleanup_cron');
function setup_daily_order_cleanup_cron() {
if (!wp_next_scheduled('daily_order_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'daily_order_cleanup_hook');
}
}Шаг 2. Реализуем функцию удаления заказов по статусу и возрасту
Вешаем обработчик на наш крон-хук:
add_action('daily_order_cleanup_hook', 'delete_old_unpaid_cancelled_orders');
function delete_old_unpaid_cancelled_orders() {
global $wpdb;
$days_pending = 30; // Удалять неоплаченные заказы старше 30 дней
$days_cancelled = 60; // Удалять отменённые заказы старше 60 дней
$pending_date = date('Y-m-d H:i:s', strtotime('-' . $days_pending . ' days'));
$cancelled_date = date('Y-m-d H:i:s', strtotime('-' . $days_cancelled . ' days'));
// Получаем ID неоплаченных заказов старше $days_pending дней
$pending_orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < %s",
$pending_date
));
// Получаем ID отменённых заказов старше $days_cancelled дней
$cancelled_orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
$cancelled_date
));
$orders_to_delete = array_merge($pending_orders, $cancelled_orders);
if (!empty($orders_to_delete)) {
foreach ($orders_to_delete as $order_id) {
wp_delete_post($order_id, true); // true - принудительно удаляем без корзины
}
}
}Шаг 3. Проверяем и очищаем задачу WP-Cron (опционально)
При необходимости удалите старую задачу, чтобы избежать дублирования:
wp_clear_scheduled_hook('daily_order_cleanup_hook');Как проверить, что удаление работает корректно
- Отслеживайте количество заказов с помощью SQL-запросов, приведённых в разделе диагностики, до и после запуска задачи.
- Включите логирование в функции удаления, например, записывайте удалённые ID в отдельный файл или в debug.log, чтобы убедиться, что процесс выполняется.
- Запустите очистку вручную, вызвав функцию delete_old_unpaid_cancelled_orders() через WP-CLI или временно через admin-ajax, чтобы проверить, что заказы действительно удаляются.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что WP-Cron работает. На некоторых хостингах он отключён. Запустите вручную функцию и проверьте права доступа.
- Удаляются не те заказы: Убедитесь, что используемые статусы 'wc-pending' и 'wc-cancelled' соответствуют вашим настройкам WooCommerce. В некоторых магазинах могут использоваться другие статусы.
- Большая нагрузка на базу: Если заказов очень много, разбейте удаление на партии, используя LIMIT в SQL и повторные вызовы функции.
- Потеря важных данных: Перед внедрением всегда делайте резервную копию базы. Проверьте, что удаляются только старые заказы.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post()с параметромtrueдля полного удаления, чтобы не оставлять метаданные и связи. - Не запускайте удаление чаще, чем раз в сутки — это снизит нагрузку.
- Если база очень большая, рассмотрите запуск удаления через WP-CLI скрипт с пагинацией.
- Добавьте логирование удаления в отдельный файл для аудита и быстрого выявления проблем.
- Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpcoder.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-neoplachennyh-i-otmenennyh-zakazov-po-srokam) для оптимизации базы и удаления данных без написания кода.