Диагностика проблемы с неоплаченными заказами в WooCommerce
На крупных WooCommerce-магазинах часто накапливается множество неоплаченных заказов. Это не только загромождает базу данных, но и может влиять на отчёты и производительность сайта. Уточните, что именно вы считаете неоплаченным заказом — обычно это заказы со статусом pending или failed, которые не были оплачены в течение определённого времени.
Для диагностики выполните следующий SQL-запрос в базе данных (через phpMyAdmin или любой клиент MySQL), чтобы увидеть количество таких заказов и их возраст:
SELECT ID, post_date, post_status FROM wp_posts
WHERE post_type = 'shop_order'
AND post_status IN ('wc-pending', 'wc-failed')
ORDER BY post_date ASC;Если количество таких заказов значительно, стоит автоматизировать их удаление.
Пошаговое решение: автоматическое удаление заказов по срокам
1. Определяем срок удаления
Часто используют срок 7 дней для неоплаченных заказов. Можно задать его в секундах:
define('ORDER_EXPIRATION_SECONDS', 7 * 24 * 60 * 60); // 7 дней2. Создаем функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или создайте небольшой плагин:
function wc_delete_expired_unpaid_orders() {
$expiration = time() - ORDER_EXPIRATION_SECONDS;
// Получаем заказы в статусах pending и failed, старше срока
$args = array(
'limit' => -1,
'status' => array('pending', 'failed'),
'date_created' => '<' . gmdate('Y-m-d H:i:s', $expiration),
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Перемещаем в корзину
// Для полного удаления вместо wp_trash_post используйте wp_delete_post($order_id, true);
}
}
}
// Запускаем ежедневно
add_action('woocommerce_cleanup_expired_orders', 'wc_delete_expired_unpaid_orders');
// Регистрируем cron задачу при активации
function wc_schedule_cleanup_cron() {
if (!wp_next_scheduled('woocommerce_cleanup_expired_orders')) {
wp_schedule_event(time(), 'daily', 'woocommerce_cleanup_expired_orders');
}
}
add_action('wp', 'wc_schedule_cleanup_cron');3. Удаление заказов из корзины (очистка)
Заказы, перемещённые в корзину, не удаляются сразу. Можно добавить очистку корзины раз в 2 недели:
function wc_empty_trash_orders() {
global $wpdb;
$trash_status = 'trash';
$older_than = gmdate('Y-m-d H:i:s', strtotime('-14 days'));
$orders_in_trash = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_modified < %s",
$trash_status, $older_than
));
if (!empty($orders_in_trash)) {
foreach ($orders_in_trash as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
}
add_action('woocommerce_cleanup_expired_orders', 'wc_empty_trash_orders');Проверка результата после внедрения
Для проверки:
- Создайте тестовый заказ в статусе
pending. - Измените дату создания заказа в базе данных на дату старше 7 дней (например, вручную через phpMyAdmin).
- Запустите крон-задачу вручную: используйте плагин WP Crontrol или вызов функции через админку.
- Проверьте, что заказ переместился в корзину, а спустя 14 дней полностью удалился.
Частые ошибки и как их исправить
- Крон-задача не запускается — проверьте, активирован ли WP-Cron, или настройте системный cron на сервере.
- Заказы не удаляются — убедитесь, что статусы заказов указаны корректно: WooCommerce добавляет префикс
wc-к статусам, например,wc-pending, но вwc_get_ordersнадо использовать без префикса. - Удаление заказов приводит к потере данных — сначала используйте
wp_trash_post(), чтобы убедиться, что вы не удаляете нужные заказы безвозвратно. - Проблемы с правами — убедитесь, что пользователь, под которым запускается WordPress, имеет права на удаление постов.
Практические советы по безопасности и производительности
- Не запускайте удаление слишком часто — достаточно один раз в день.
- Для крупных сайтов ограничьте количество удаляемых заказов за один цикл, чтобы избежать перегрузки БД.
- Регулярно резервируйте базу данных перед автоматическим удалением заказов.
- Используйте плагины кеширования и оптимизации (например, Clearfy Pro) для поддержки производительности после удаления большого объёма данных.
Сравнение вариантов удаления неоплаченных заказов
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление через админку WooCommerce | Удаление заказов вручную по фильтрам | Простота, контроль | Трудозатратно, не подходит для большого количества |
| Автоматический код в functions.php (cron) | Удаление заказов по срокам с помощью кода и cron | Автоматизация, гибкость, без плагинов | Необходимость контроля и корректной настройки cron |
| Специализированные плагины | Плагины для очистки заказов (например, WP Bulk Delete) | Удобный интерфейс, функционал настройки | Нагрузка, возможные конфликты, зависит от поддержки плагина |