Диагностика проблемы: зачем удалять неоплаченные заказы
В WooCommerce неоплаченные заказы (статус pending или failed) могут накапливаться в базе, загромождая админку и замедляя работу сайта. Особенно это актуально для крупных магазинов с высокой конверсией и большим количеством отказов. Автоматическое удаление устаревших неоплаченных заказов помогает поддерживать чистоту базы и улучшить производительность.
Как определить заказы, подлежащие удалению
Мы будем удалять только те заказы, которые находятся в статусе pending или failed и были созданы более 24 часов назад. Это гарантирует, что активные или недавно созданные заказы не пострадают.
SQL-запрос для диагностики
Для проверки количества таких заказов выполним запрос в базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 1 DAY;Если значение большое, есть смысл автоматизировать удаление.
Пошаговое решение: реализация автоматического удаления заказов через WP-Cron
Лучший способ — создать функцию, которая удаляет заказы и привязать её к периодическому событию WP-Cron.
1. Добавляем функцию удаления заказов
function wpb_delete_old_unpaid_orders() {
global $wpdb;
$interval = 24; // часы
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $interval . ' hours'));
// Получаем ID заказов, которые старше 24 часов и имеют статус pending или failed
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status IN ('wc-pending', 'wc-failed')
AND post_date < %s",
$date_threshold
));
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — без перемещения в корзину
}
}
}2. Регистрируем событие WP-Cron
function wpb_schedule_order_cleanup() {
if (!wp_next_scheduled('wpb_delete_old_orders_hook')) {
wp_schedule_event(time(), 'hourly', 'wpb_delete_old_orders_hook');
}
}
add_action('wp', 'wpb_schedule_order_cleanup');
add_action('wpb_delete_old_orders_hook', 'wpb_delete_old_unpaid_orders');3. Отмена по желанию (например, при деактивации плагина)
function wpb_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpb_delete_old_orders_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpb_delete_old_orders_hook');
}
}
register_deactivation_hook(__FILE__, 'wpb_clear_order_cleanup_schedule');Проверка результата после внедрения
- Зайдите в админку WooCommerce → Заказы и поставьте фильтр по статусу "Ожидает оплаты" (pending) и "Неудачный" (failed).
- Проверьте, что заказы старше 24 часов исчезают или отсутствуют спустя несколько часов после активации кода.
- Выполните вручную функцию из консоли WP-CLI:
wp eval 'wpb_delete_old_unpaid_orders();'— проверьте, что ненужные заказы удаляются.
Частые ошибки и как их исправить
- Код не запускается — нет события WP-Cron: Убедитесь, что на сайте посещения есть, так как WP-Cron запускается при загрузках страниц. Для теста можно вызвать функцию вручную.
- Удаляются не те заказы или удаление не происходит: Проверьте правильность статусов заказов. В WooCommerce статусы начинаются с
wc-, напримерwc-pending. - Удаление приводит к ошибкам плагинов: Убедитесь, что удаление заказов происходит только после проверки их статуса и возраста. Не удаляйте заказы в статусах «в обработке» или «завершён».
- Заказы не удаляются, если используется внешний кеш: Очистите кеш сайта и браузера после внедрения кода.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true);для полного удаления, чтобы не оставлять в базе мусор. - Запускайте удаление не чаще раза в час, чтобы избежать нагрузки на базу.
- Добавьте логирование в файл, чтобы отслеживать, сколько заказов удаляется за раз:
function wpb_delete_old_unpaid_orders() {
global $wpdb;
$interval = 24;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $interval . ' hours'));
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status IN ('wc-pending', 'wc-failed')
AND post_date < %s",
$date_threshold
));
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
error_log('Удалено заказов: ' . count($orders));
} else {
error_log('Заказы для удаления не найдены');
}
}- Если вы используете плагин Clearfy Pro от WPSHOP, там есть возможность оптимизации базы с удалением заказов по статусам — рассмотрите как альтернативу.
Сравнение вариантов удаления неоплаченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron и кастомный код | Полный контроль, без лишних плагинов | Требует навыков, зависит от посещаемости сайта |
| Плагин для очистки базы (например, Clearfy Pro) | Простота настройки, доп. функции оптимизации | Плагин — дополнительная нагрузка и стоимость |
| Ручное удаление через админку | Безопасно, просто | Неавтоматично, неудобно при большом объеме |