Диагностика проблемы с неактивными заказами в WooCommerce
В магазинах на WooCommerce часто накапливаются заказы в статусах, которые не изменяются длительное время — например, "ожидает оплаты" или "отменён". Это приводит к раздуванию базы данных, замедлению запросов и усложнению работы с заказами.
Чтобы выявить проблему, проверьте количество заказов в таких статусах и дату их создания:
SELECT post_status, COUNT(*) AS count, MIN(post_date) AS oldest_order
FROM wp_posts
WHERE post_type = 'shop_order'
GROUP BY post_status;Результат покажет, сколько заказов и с какой самой старой датой находятся в каждом статусе. Если вы видите большое количество заказов в статусах вроде wc-pending или wc-cancelled старше нескольких месяцев — пора автоматизировать их удаление.
Пошаговое решение: удаление заказов по срокам с помощью WP-Cron
1. Создание функции удаления заказов
Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код. Он удалит все заказы в указанных статусах, которые старше заданного количества дней.
function wps_remove_old_woocommerce_orders() {
$statuses_to_delete = array('wc-pending', 'wc-cancelled'); // Статусы для удаления
$days_old = 30; // Удалять заказы старше 30 дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses_to_delete,
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$old_orders = get_posts($args);
if (!empty($old_orders)) {
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // Удаляем без перемещения в корзину
}
}
}
2. Регистрация WP-Cron задачи для регулярного запуска
Чтобы функция запускалась автоматически, добавим задачу в WP-Cron. Например, запускать раз в сутки.
function wps_schedule_old_orders_cleanup() {
if (!wp_next_scheduled('wps_daily_old_orders_cleanup')) {
wp_schedule_event(time(), 'daily', 'wps_daily_old_orders_cleanup');
}
}
add_action('wp', 'wps_schedule_old_orders_cleanup');
add_action('wps_daily_old_orders_cleanup', 'wps_remove_old_woocommerce_orders');
Проверка результата после внедрения
Чтобы проверить, что удаление работает корректно:
- Создайте тестовые заказы в статусах
pendingиcancelledс датами старше 30 дней (можно через SQL или программно). - Запустите функцию вручную из консоли WP-CLI или через временный вызов в
functions.php:
wps_remove_old_woocommerce_orders();- Проверьте, что заказы удалились из базы (в админке или через SQL).
- Проверьте логи ошибок и производительность сайта — не должно быть сбоев.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что статусы указаны с префиксом
wc-(например,wc-pending), а не простоpending. - Функция не запускается по расписанию: Убедитесь, что WP-Cron работает (не отключен) и есть посещения сайта для его срабатывания, либо используйте реальный cron на сервере.
- Удаление приводит к ошибкам: Возможно, другие плагины или кастомный код блокируют удаление заказов. Проверьте права пользователя и используйте
wp_delete_post($order_id, true)для принудительного удаления. - Удаление не учитывает нужные статусы: Проверьте через
print_r(wc_get_order_statuses())все возможные статусы и выберите подходящие.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы данных перед внедрением автоматического удаления.
- Ограничивайте выборку заказов по дате и статусу, чтобы избежать долгих запросов и нагрузки.
- Для больших магазинов используйте пакетную обработку (например, удалять по 100 заказов за раз).
- Проверяйте права пользователя, под которым запускается код — лучше использовать роль администратора.
- Если магазин использует сторонние сервисы для учёта заказов, синхронизируйте удаление с ними, чтобы не потерять важные данные.
Сравнение вариантов реализации автоматического удаления заказов
| Метод | Плюсы | Минусы | Требования |
|---|---|---|---|
| Код на WP-Cron (как в статье) | Гибкость, без плагинов, точечное управление | Зависит от посещаемости сайта, требует навыков PHP | Доступ к файлам сайта, базовые знания PHP |
| Плагины очистки заказов (например, WP Bulk Delete) | Простота настройки, графический интерфейс | Могут быть лишние функции, нагрузка на БД при больших объемах | Установка плагина, возможно платные функции |
| Ручное удаление через админку WooCommerce | Простота, не требует кода | Трудозатратно, риск пропусков | Время и внимание администратора |