Диагностика проблемы с накоплением заказов в WooCommerce
При работе интернет-магазина на WooCommerce со временем база данных увеличивается за счёт большого количества заказов, в том числе уже выполненных и архивных. Это замедляет работу сайта, увеличивает время резервного копирования и усложняет администрирование. Чтобы избежать этих проблем, полезно настроить автоматическое удаление старых заказов, которые уже не актуальны.
Как определить, что нужно удалять
- Заказы со статусом
completedилиcancelledстарше 6 месяцев или другого срока, подходящего бизнесу. - Заказы со статусом
failedилиpending, которые не были оплачены и не менялись долгое время.
Вы можете проверить количество таких заказов через SQL-запрос в базе данных или через WP-CLI:
wp post list --post_type=shop_order --post_status=completed --field=ID --date_query_column=post_date --date_query_after='6 months ago' | wc -lПошаговое решение: настройка автоматического удаления заказов через код
WooCommerce не предлагает встроенной функции для автоматического удаления заказов, поэтому лучший вариант — создать пользовательский скрипт и запускать его по cron.
1. Создаём функцию для удаления заказов старше N дней
function wc_delete_old_orders( $days = 180 ) {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-completed', 'wc-cancelled'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => "$days days ago",
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_orders = get_posts( $args );
foreach ( $old_orders as $order_id ) {
wp_delete_post( $order_id, true ); // true — удаляем без возможности восстановления
}
return count( $old_orders );
}2. Добавляем cron-задачу для ежемесячного запуска удаления
add_action( 'wp_loaded', 'wc_schedule_old_orders_deletion' );
function wc_schedule_old_orders_deletion() {
if ( ! wp_next_scheduled( 'wc_delete_old_orders_cron_hook' ) ) {
wp_schedule_event( time(), 'monthly', 'wc_delete_old_orders_cron_hook' );
}
}
add_action( 'wc_delete_old_orders_cron_hook', 'wc_cron_delete_old_orders' );
function wc_cron_delete_old_orders() {
$deleted_count = wc_delete_old_orders( 180 );
error_log( "WooCommerce: удалено заказов старше 180 дней - $deleted_count" );
}3. Как запустить вручную для проверки
Временно вызовите функцию в functions.php или через WP-CLI для теста:
echo 'Удалено заказов: ' . wc_delete_old_orders(30); // удаляем заказы старше 30 днейПроверка результата после внедрения
Чтобы убедиться, что автоматическое удаление работает:
- Проверьте логи PHP на наличие строки с количеством удалённых заказов.
- Просмотрите список заказов в админке WooCommerce — число старых заказов должно уменьшиться.
- Запустите вручную функцию с меньшим значением дней, чтобы проверить удаление.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что cron-задание зарегистрировано (wp cron event list). Возможно, нужно запустить wp cron manually или настроить системный cron.
- Удаляются не те заказы: проверьте правильность статусов заказов в массиве
post_status. WooCommerce использует статус с префиксомwc-. - Производительность падает при удалении: если заказов много, удаляйте пачками (пагинация) или делайте паузы между запросами.
Практические советы по безопасности и производительности
- Удаляйте заказы только после полного анализа, чтобы не потерять важные данные для бухгалтерии.
- Резервное копирование базы перед запуском удаления обязательно.
- Используйте wp_delete_post с параметром
$force_delete = true, чтобы полностью убрать запись, иначе заказ попадёт в корзину. - Для больших магазинов используйте WP-CLI скрипты с пагинацией и ограничением количества удаляемых заказов за один запуск.
Сравнение вариантов удаления старых заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоёмко при большом объёме заказов |
| Код с cron-задачей (описанный способ) | Автоматизация, гибкость, контроль | Нужны базовые навыки программирования |
| Плагины для очистки заказов | Удобный интерфейс, дополнительные опции | Риск несовместимости, нагрузка на сайт |