Диагностика проблемы с неактуальными заказами в WooCommerce
В интернет-магазинах на WooCommerce накапливаются отменённые и неактивные заказы, которые не нужны для дальнейшей работы и загромождают базу данных. Они увеличивают размер базы, замедляют запросы и делают отчёты менее точными. Чтобы проверить наличие таких заказов, выполните SQL-запрос в phpMyAdmin или через WP-CLI:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-pending');
Если количество превышает несколько сотен или тысяч — пора автоматизировать их удаление.
Как автоматически удалять отменённые и неактивные заказы в WooCommerce
Оптимальный способ — использовать планировщик WordPress (WP-Cron) для регулярного выполнения кода, который удалит заказы с нужными статусами. Ниже пример кода, который удаляет заказы со статусами wc-cancelled и wc-pending, старше 30 дней:
function wpb_delete_old_cancelled_orders() {
$days = 30;
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-pending'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // принудительное удаление
}
}
}
// Планирование задачи при активации темы или плагина
if (!wp_next_scheduled('wpb_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wpb_daily_delete_cancelled_orders');
}
// Хук на ежедневное событие
add_action('wpb_daily_delete_cancelled_orders', 'wpb_delete_old_cancelled_orders');
Объяснение кода
get_postsполучает ID заказов с нужным статусом, старше 30 дней;wp_delete_postудаляет эти заказы без возможности восстановления;- Планировщик запускает функцию ежедневно — это достаточно часто для большинства магазинов.
Проверка результата
После внедрения кода можно проверить наличие старых заказов вручную через SQL-запрос, как в разделе диагностики, или в админке WooCommerce. Через пару дней после запуска скрипта старые отменённые и неактивные заказы должны исчезнуть.
Также можно добавить логирование для контроля работы скрипта:
function wpb_delete_old_cancelled_orders() {
$days = 30;
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-cancelled', 'wc-pending'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
error_log("Deleted order ID: " . $order_id);
}
}
}
Логи можно просматривать через файл wp-content/debug.log при включённом WP_DEBUG_LOG.
Частые ошибки и как их исправить
- Отсутствие запланированного задания (Cron не работает): проверьте, что WP-Cron запускается корректно. Для этого посетите сайт и запустите команду
wp cron event listчерез WP-CLI. Если Cron не срабатывает, настройте системный cron на сервере. - Неправильные статусы заказов: проверьте, что используете правильные статусы (например,
wc-cancelled,wc-pending). Для кастомных статусов нужно корректно их указать. - Проблемы с правами на удаление: убедитесь, что код выполняется с правами администратора и что пользователь базы данных имеет права на удаление записей.
- Удаление заказов с важными данными: всегда делайте резервные копии базы, чтобы избежать потери важных данных при ошибках в логике.
Практические советы по безопасности и производительности
- Запускайте удаление заказов в ночное время, чтобы не нагружать сервер в часы пик.
- Ограничьте количество удаляемых заказов за один запуск, чтобы избежать тайм-аутов. Например, добавьте параметр
'posts_per_page' => 100и несколько запусков. - Используйте постоянные резервные копии, как с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpbloger.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-otmenennyh-i-neaktivnyh-zakazov), чтобы быстро восстановиться при ошибках.
- Для больших магазинов рассмотрите удаление заказов напрямую через SQL-запросы с осторожностью, чтобы повысить скорость.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + wp_delete_post() | Безопасно, учитывает все хуки WooCommerce, совместимо с плагинами | Медленнее при большом количестве заказов, зависит от Cron | Код из статьи |
| SQL-запрос на удаление (DELETE) | Очень быстро для больших объёмов | Может нарушить целостность базы, не запускает хуки | DELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled' AND post_date < NOW() - INTERVAL 30 DAY; |
| Использование плагинов очистки | Удобно, с интерфейсом, без кода | Может быть платным, менее гибко | Clearfy Pro — https://wpshop.ru/plugins/clearfy?utm_source=wpbloger.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-otmenennyh-i-neaktivnyh-zakazov |