Проблема: накопление неактивных заказов в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда в базе данных скапливаются заказы, которые не были оплачены или обработаны длительное время. Такие «зависшие» заказы занимают место, замедляют работу админки и могут путать при аналитике и отчетах.
Цель — автоматически удалять заказы со статусом pending, failed или подобными, если они старше заданного срока, например, 30 дней.
Диагностика проблемы
Первым делом убедитесь, какие статусы заказов у вас считаются неактивными и сколько таких заказов в базе:
SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Выполните этот запрос через phpMyAdmin или WP-CLI. Если количество заказов с статусом pending или failed большое и они старые, это повод для автоматизации их удаления.
Пошаговое решение: автоматическое удаление старых неактивных заказов через WP-Cron
1. Создаем функцию очистки заказов
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wc_delete_old_inactive_orders() {
$days = 30; // Период хранения заказов
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем заказы со статусом pending или failed старше $days
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed'),
'date_query' => array(
array(
'before' => $date,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Можно использовать wp_delete_post для полного удаления
}
}
}2. Добавляем крон-задачу для регулярного запуска
Чтобы функция запускалась автоматически, зарегистрируем крон-событие:
add_action('wc_daily_delete_old_orders', 'wc_delete_old_inactive_orders');
function wc_schedule_daily_order_cleanup() {
if (!wp_next_scheduled('wc_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wc_daily_delete_old_orders');
}
}
add_action('wp', 'wc_schedule_daily_order_cleanup');Этот код создаст задачу, которая будет запускаться раз в сутки и удалять старые неактивные заказы.
3. Очистка и отмена задачи (при необходимости)
Если потребуется остановить автоматическую очистку, можно отменить задачу:
function wc_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wc_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wc_daily_delete_old_orders');
}
}Вызовите функцию wc_clear_order_cleanup_schedule() один раз, например, через админ-панель.
Проверка результата после внедрения
- Подождите сутки или вручную вызовите функцию
wc_delete_old_inactive_orders()через консоль WP-CLIwp eval 'wc_delete_old_inactive_orders();' - Проверьте, что заказы со статусом
pendingи датой создания старше 30 дней перемещены в корзину или удалены (если заменитеwp_trash_postнаwp_delete_post) - В админке WooCommerce проверьте количество заказов с этими статусами — они должны уменьшиться
- Проверьте журнал cron-задач с помощью плагина WP Crontrol или аналогичного, чтобы убедиться, что задача запланирована
Частые ошибки и их исправление
1. Заказы не удаляются
- Причина: функция не вызывается. Проверьте, что крон-задача запущена, или вызовите функцию вручную.
- Причина: неправильные статусы заказов. В WooCommerce статусы заказов имеют префикс
wc-, например,wc-pending. Убедитесь, что они указаны верно.
2. Функция удаляет лишние заказы
- Проверьте условие даты и статусы заказов, чтобы не затронуть активные или оплаченные заказы.
3. Ошибки при удалении заказов
- Убедитесь, что у PHP и WordPress есть права на удаление постов.
- Проверьте логи ошибок сервера.
Практические советы по безопасности и производительности
- Используйте
wp_trash_post()вместоwp_delete_post()для возможности восстановления заказов из корзины. - Если заказов очень много, разбивайте удаление на партии по 100-200 штук, чтобы избежать таймаута.
- Для мониторинга работы крон-задач используйте плагин Clearfy Pro, который позволяет отследить и оптимизировать задачи WP-Cron.
- Период хранения настраивайте исходя из специфики бизнеса — например, для предоплаченных заказов можно сделать отдельные правила.
Сравнение методов удаления старых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота | Трудозатратно, риск пропуска заказов |
| SQL-запросы в базе | Быстро и эффективно | Риск ошибочного удаления, требует знаний SQL |
| WP-Cron с PHP-функцией (решение в статье) | Автоматизация, безопасно (корзина), гибкость | Зависит от работы WP-Cron, требует настройки |