Проблема: накопление отменённых и завершённых заказов в WooCommerce
WooCommerce по умолчанию хранит все заказы, включая отменённые и уже завершённые. Со временем это приводит к разрастанию базы данных, замедлению админки и отчетов, а также усложняет управление заказами. Чтобы поддерживать базу в чистоте, полезно настроить автоматическое удаление таких заказов через код.
Диагностика проблемы
Чтобы оценить, насколько проблема актуальна, выполните следующие шаги:
- Войдите в админ-панель WordPress, откройте раздел WooCommerce → Заказы.
- Отфильтруйте заказы по статусам
cancelledиcompleted. - Оцените количество заказов с этими статусами. Если их тысячи и они старше нескольких месяцев, база требует очистки.
- Проверьте размер таблиц
wp_postsиwp_postmetaв базе данных, связанных с заказами. Большой объем данных замедляет запросы.
Пошаговое решение: автоматическое удаление заказов по статусу и дате
Ниже приведён пример кода, который можно добавить в файл functions.php вашей темы или в отдельный кастомный плагин. Он удалит все отменённые и завершённые заказы, которым больше 30 дней, при запуске WordPress Cron (WP-Cron).
function wp24_delete_old_woocommerce_orders() {
if ( ! class_exists('WooCommerce') ) {
return; // WooCommerce не активен
}
global $wpdb;
$statuses = array('cancelled', 'completed');
$days = 30; // удалять заказы старше 30 дней
$date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ( $statuses as $status ) {
// Получаем ID заказов по статусу и дате
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
'wc-' . $status, $date_limit
));
if ( ! empty($order_ids) ) {
foreach ( $order_ids as $order_id ) {
// Удаляем заказ и связанные метаданные
wp_delete_post($order_id, true);
}
}
}
}
// Запускаем функцию раз в сутки
add_action('wp_scheduled_delete_old_orders', 'wp24_delete_old_woocommerce_orders');
if ( ! wp_next_scheduled('wp_scheduled_delete_old_orders') ) {
wp_schedule_event(time(), 'daily', 'wp_scheduled_delete_old_orders');
}Объяснение кода
- Функция
wp24_delete_old_woocommerce_ordersпроверяет наличие WooCommerce. - Выбирает заказы со статусами
cancelledиcompleted, старше 30 дней. - Удаляет заказы с помощью
wp_delete_postс параметромtrueдля полного удаления. - Функция запускается ежедневно через WP-Cron.
Проверка результата после внедрения
- Подождите следующий запуск WP-Cron (или вызовите вручную через плагин WP Crontrol).
- В админке WooCommerce проверьте количество заказов со статусом
cancelledиcompleted— должны исчезнуть те, что старше 30 дней. - Проверьте размер таблиц
wp_postsиwp_postmeta— они должны уменьшиться. - Можно временно добавить логирование для отладки, например,
error_log('Deleted order ID: ' . $order_id);внутри цикла.
Частые ошибки и как их исправить
- Код не запускается: проверьте, активен ли WP-Cron на сайте. Для ручного запуска используйте плагин WP Crontrol.
- Заказы не удаляются: убедитесь, что статусы заказов указаны правильно с префиксом
wc-, например,wc-cancelled. - Удаляются не те заказы: проверьте условие выборки даты, возможно, часовой пояс сайта влияет на вычисления.
- Проблемы с производительностью при удалении: если заказов много, лучше делать удаление пакетами, добавив лимит и повторный запуск через WP-Cron.
Практические советы по безопасности и производительности
- Перед удалением заказов создайте резервную копию базы данных.
- Для больших магазинов делайте удаление партиями, например, по 100 заказов за раз.
- Отключайте WP-Cron на сервере и используйте системный cron для стабильности.
- Добавьте проверку прав пользователя, если создаёте интерфейс для запуска очистки вручную.
Сравнение вариантов очистки заказов WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Простота, не требует кода | Трудоемко при большом количестве заказов |
| Плагин для очистки заказов | Удобство, расширенные настройки | Дополнительная нагрузка, возможны конфликты |
| Код в functions.php (автоматизация) | Контроль, отсутствие сторонних плагинов | Требует навыков, возможны ошибки в коде |