Проблема: зачем и когда нужно удалять заказы WooCommerce автоматически
В крупных интернет-магазинах на WooCommerce накапливаются тысячи заказов, включая старые, отменённые или проваленные. Они захламляют базу данных, замедляют админку и увеличивают размер резервных копий. Ручное удаление неудобно, а стандартных инструментов для массовой очистки заказов WooCommerce по дате и статусу нет. Автоматизация этой задачи помогает поддерживать базу в оптимальном состоянии.
Диагностика: как определить, что пора чистить заказы
Для оценки накопления старых заказов воспользуйтесь SQL-запросом для подсчёта заказов по статусам и дате:
SELECT post_status, COUNT(*) AS count_orders FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если количество заказов с статусами wc-cancelled, wc-failed или wc-refunded превышает несколько тысяч, а последние обновления были несколько месяцев назад, это сигнал к очистке.
Пошаговое решение: автоматическое удаление заказов по дате и статусу с WP-Cron
1. Создаём функцию для удаления заказов
Функция принимает параметры — массив статусов и дату, по которым удалит заказы:
function wp1_delete_old_orders_by_status_and_date($statuses = ['wc-cancelled', 'wc-failed'], $older_than_days = 30) {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$older_than_days} days"));
// Получаем ID заказов для удаления
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('" . implode("','", $statuses) . "') AND post_date < %s",
$date_threshold
));
if (empty($order_ids)) {
return 0; // Нет заказов для удаления
}
require_once ABSPATH . 'wp-admin/includes/post.php';
$deleted_count = 0;
foreach ($order_ids as $order_id) {
// Удаляем заказ без возможности восстановления
if (wp_delete_post($order_id, true)) {
$deleted_count++;
}
}
return $deleted_count;
}2. Регистрируем задачу WP-Cron для ежедневного запуска
add_action('wp1_daily_delete_old_orders', function() {
$deleted = wp1_delete_old_orders_by_status_and_date(['wc-cancelled', 'wc-failed', 'wc-refunded'], 60);
if ($deleted) {
error_log("[WP1] Deleted {$deleted} old WooCommerce orders.");
}
});
// Добавляем расписание при активации темы или плагина
function wp1_schedule_delete_orders_cron() {
if (!wp_next_scheduled('wp1_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wp1_daily_delete_old_orders');
}
}
add_action('wp', 'wp1_schedule_delete_orders_cron');3. Как отключить задачу
function wp1_unschedule_delete_orders_cron() {
$timestamp = wp_next_scheduled('wp1_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp1_daily_delete_old_orders');
}
}Проверка результата после внедрения
- Выполните вручную функцию
wp1_delete_old_orders_by_status_and_date(['wc-cancelled'], 1)через WP-CLI или временный вызов, чтобы сразу увидеть результат удаления. - Проверьте лог ошибок сервера или файл
debug.log(если включён WP_DEBUG_LOG) на наличие записей с удалёнными заказами. - В админке WooCommerce зайдите в раздел Заказы и отфильтруйте по статусам, чтобы убедиться, что старые заказы отсутствуют.
Частые ошибки и как исправить
Ошибка 1: заказы не удаляются, хотя функция возвращает положительный результат
Причина: кэш объектов или плагин кеширования задерживает обновления. Решение: очистите кеш WordPress и кеш браузера, проверьте отключение кеширующих плагинов.
Ошибка 2: функция wp_delete_post возвращает false
Причина: недостаточно прав у пользователя, под которым выполняется код, или конфликт с плагинами безопасности. Решение: убедитесь, что код выполняется от имени администратора, временно отключите плагины безопасности для теста.
Ошибка 3: задача WP-Cron не запускается
Причина: на сайте отключён WP-Cron или мало посетителей. Решение: настройте системный cron на вызов wp-cron.php или запускайте задачи вручную через WP-CLI.
Практические советы по безопасности и производительности
- Удаляйте старые заказы только с правильными статусами: отменённые, проваленные или возвращённые — не трогайте оплаченные и обрабатываемые.
- Перед удалением делайте резервные копии базы данных.
- Для больших магазинов удаляйте заказы партиями, чтобы избежать тайм-аутов PHP (можно реализовать пагинацию в SQL-запросе).
- Отключите удаление заказов в периоды пиковых нагрузок.
- Используйте WP-CLI для запуска очистки на больших магазинах — это более надёжно, чем WP-Cron.
Сравнение вариантов реализации автоматического удаления заказов WooCommerce
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| WP-Cron с кастомным кодом | Гибко, без сторонних плагинов, легко адаптировать | Зависит от посещаемости сайта, возможны тайм-ауты | Средние магазины с регулярным трафиком |
| WP-CLI скрипт для удаления | Быстро, не зависит от трафика, управляемо из терминала | Требует доступа к серверу и навыков CLI | Крупные магазины с большим объёмом заказов |
| Плагины очистки базы данных | Простота установки, интерфейс для настройки | Могут удалять лишнее, меньше контроля | Начинающие пользователи, небольшие сайты |