Диагностика проблемы накопления неактивных заказов в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending, failed или cancelled. Они не оплачены и не актуальны, но сохраняются в базе данных, что увеличивает размер таблиц и замедляет работу сайта, особенно при большом количестве заказов.
Проверьте, сколько таких заказов у вас в базе. Для этого можно выполнить SQL-запрос в phpMyAdmin или через WP-CLI:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled');Если число неактивных заказов превышает несколько тысяч, это уже весомый повод для очистки базы.
Пошаговое решение: автоматическое удаление неактивных заказов
1. Создаем функцию для удаления старых неактивных заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function premiumwp_delete_old_inactive_orders() {
global $wpdb;
$days = 30; // удалять заказы старше 30 дней
$statuses = [ 'wc-pending', 'wc-failed', 'wc-cancelled' ];
$placeholders = implode( ',', array_fill( 0, count( $statuses ), '%s' ) );
$sql = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < NOW() - INTERVAL %d DAY",
...$statuses,
$days
);
$order_ids = $wpdb->get_col( $sql );
if ( ! empty( $order_ids ) ) {
foreach ( $order_ids as $order_id ) {
wp_trash_post( $order_id ); // можно заменить на wp_delete_post($order_id, true) для безвозвратного удаления
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавьте планировщик, который будет запускать очистку раз в сутки:
function premiumwp_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'premiumwp_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'premiumwp_daily_order_cleanup' );
}
}
add_action( 'wp', 'premiumwp_schedule_order_cleanup' );
add_action( 'premiumwp_daily_order_cleanup', 'premiumwp_delete_old_inactive_orders' );3. Запускаем очистку вручную для первичной очистки
Для первичной очистки можно вызвать функцию напрямую из админки, добавив временный хук:
add_action( 'admin_init', function() {
if ( current_user_can( 'manage_woocommerce' ) && isset( $_GET['run_order_cleanup'] ) ) {
premiumwp_delete_old_inactive_orders();
wp_redirect( admin_url() );
exit;
}
});Перейдите в админку и добавьте в адресную строку ?run_order_cleanup=1 для запуска.
Проверка результата после внедрения
После запуска функции проверьте количество неактивных заказов повторным SQL-запросом. Их количество должно уменьшиться на количество удаленных заказов.
Также проверьте в админке WooCommerce - теперь старые неактивные заказы должны отсутствовать или перемещены в корзину.
Частые ошибки и как их исправить
- Неправильные статусы заказов в запросе: WooCommerce использует префикс
wc-в статусах заказов, например,wc-pending. Проверьте актуальные статусы в базе и используйте их в коде. - Отсутствует или неактивен WP-Cron: если на хостинге WP-Cron не запускается, автоматическая очистка не будет работать. Используйте системный cron для вызова
wp-cron.php. - Случайное удаление важных заказов: уточните период удаления и статусы, чтобы не потерять нужные данные. Рекомендуется сначала переносить заказы в корзину (
wp_trash_post), а не удалять навсегда. - Проблемы с производительностью при большом количестве заказов: если заказов очень много, разбивайте удаление на части с пагинацией, чтобы не заблокировать сервер.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()для безопасного удаления с возможностью восстановления, особенно на старте. - Налаживайте мониторинг системных cron задач, чтобы убедиться, что планировщик выполняется регулярно.
- Оптимизируйте запрос, добавляя индексы на поле
post_statusиpost_date, если база большая. - Регулярно создавайте резервные копии базы перед массовыми удалениями. Для автоматизации используйте плагин Clearfy Pro, который также помогает очищать базу.
Сравнение методов удаления неактивных заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Трудоемко при большом количестве заказов |
| SQL-запросы напрямую | Быстрое удаление, полный контроль | Риск повреждения данных, требуется SQL-знание |
| Автоматизация через WP-Cron и код | Автоматическая очистка, безопасное удаление с корзиной | Зависит от работы WP-Cron, требует тестирования |