Диагностика проблемы: зачем удалять отменённые заказы
В стандартной установке WooCommerce отменённые заказы остаются в базе данных, что со временем может создавать нагрузку и путаницу в админке. Если на сайте много возвратов и отмен, база растёт, а отчёты и аналитика усложняются из-за большого количества неактивных записей. Автоматическое удаление отменённых заказов помогает очистить базу и поддерживать актуальность данных.
Как определить, что ваша база нуждается в очистке
- В админке WooCommerce видите большое число заказов со статусом
cancelled. - Сайт начинает работать медленнее, особенно страницы с заказами и отчётами.
- База данных занимает много места из-за таблицы
wp_postsс заказами.
Пошаговое решение: удаление отменённых заказов через WP-Cron
1. Создаём функцию для удаления отменённых заказов
function wpdirect_delete_cancelled_orders() {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - принудительно удаляем без перемещения в корзину
}
}
}2. Регистрируем событие WP-Cron для периодического запуска
if (!wp_next_scheduled('wpdirect_daily_cancelled_orders_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpdirect_daily_cancelled_orders_cleanup');
}
add_action('wpdirect_daily_cancelled_orders_cleanup', 'wpdirect_delete_cancelled_orders');3. Добавляем код в functions.php вашей темы или в кастомный плагин
Рекомендуется использовать кастомный плагин, чтобы изменения не потерялись при обновлении темы.
4. (Опционально) Удаление заказов старше определённого срока
Чтобы удалять только отменённые заказы старше, например, 30 дней, модифицируйте запрос:
function wpdirect_delete_old_cancelled_orders() {
$date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled',
'posts_per_page' => -1,
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
}Проверка результата после внедрения
- После добавления кода и прохождения суток (или запуска WP-Cron вручную) проверьте базу заказов в WooCommerce — отменённые заказы должны исчезнуть.
- В базе данных MySQL выполните запрос для проверки отсутствия отменённых заказов:
SELECT COUNT(*) FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled';— результат должен быть 0 или значительно меньше. - Чтобы запустить WP-Cron вручную для проверки, используйте WP-CLI команду:
wp cron event run wpdirect_daily_cancelled_orders_cleanup(если есть доступ к серверу).
Частые ошибки и как их исправить
- Код не срабатывает, заказы не удаляются. Проверьте, что WP-Cron работает на сайте (иногда на локальных серверах или при отсутствии посетителей события не запускаются). Можно использовать плагины типа WP Crontrol для ручного запуска и отладки.
- Удаляются не те заказы. Проверьте статус заказа — WooCommerce использует статус с префиксом
wc-(например,wc-cancelled), а не простоcancelled. - Ошибка прав доступа. Убедитесь, что код выполняется в контексте, где есть права на удаление записей — обычно в админке или через WP-Cron это не проблема.
- Удаление заказов удаляет связанные данные (товары, мета). Это нормальное поведение при использовании
wp_delete_postс параметромtrue.
Практические советы по безопасности и производительности
- Удаление большого количества заказов за один раз может привести к нагрузке на базу. Если ожидается большое число отменённых заказов, используйте пагинацию и удаляйте партии по 50-100 заказов за раз.
- Регулярно делайте резервные копии базы данных перед автоматической очисткой.
- Для улучшения производительности можно отключить кэш и индексацию на время очистки.
- Рассмотрите возможность интеграции с Clearfy Pro для оптимизации базы данных и управления статусами заказов.
Сравнение вариантов реализации удаления отменённых заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Трудоёмко, неавтоматично |
| Кастомный PHP-код с WP-Cron | Полная автоматизация, гибкость | Требуются навыки разработки, возможны ошибки при некорректном коде |
| Плагины очистки базы (Clearfy, WP Optimize) | Удобный интерфейс, дополнительные функции | Может удалять лишнее, нагрузка на сайт |