Диагностика проблемы: почему заказы накапливаются в WooCommerce
В интернет-магазинах на WooCommerce часто возникает проблема с накоплением неоплаченных и отменённых заказов. Это приводит к раздуванию базы данных, замедлению работы административной панели и усложняет аналитику. Стандартных настроек WooCommerce для автоматического удаления таких заказов нет, поэтому необходимы кастомные решения.
Пошаговое решение: автоматизация удаления заказов через пользовательский хук
1. Создание функции для удаления старых заказов
Ниже пример кода, который удаляет заказы со статусом cancelled и failed, а также неоплаченные заказы со статусом pending, которые старше 7 дней:
function wpcoder_delete_old_wc_orders() {
$days = 7; // Количество дней для хранения заказов
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'status' => array('pending', 'cancelled', 'failed'),
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->delete(true); // Удаляем заказ полностью
}
}
}
2. Добавление задачи в WP-Cron для регулярного запуска
Чтобы функция выполнялась автоматически, зарегистрируем событие в WP-Cron, которое будет запускать удаление заказов ежедневно:
if (!wp_next_scheduled('wpcoder_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpcoder_daily_delete_old_orders');
}
add_action('wpcoder_daily_delete_old_orders', 'wpcoder_delete_old_wc_orders');
3. Размещение кода в плагине или functions.php темы
Рекомендуется вынести код в отдельный плагин или в дочернюю тему, чтобы избежать потери при обновлении. Пример минимального плагина:
<?php
/**
* Plugin Name: WooCommerce Auto Delete Old Orders
* Description: Удаляет неоплаченные и отменённые заказы старше 7 дней.
* Version: 1.0
* Author: WPCoder.ru
*/
add_action('init', function() {
if (!wp_next_scheduled('wpcoder_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpcoder_daily_delete_old_orders');
}
});
add_action('wpcoder_daily_delete_old_orders', 'wpcoder_delete_old_wc_orders');
function wpcoder_delete_old_wc_orders() {
$days = 7;
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'status' => array('pending', 'cancelled', 'failed'),
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
$order->delete(true);
}
}
}
Проверка результата после внедрения
- В админке WooCommerce перейдите в раздел «Заказы» и проверьте наличие старых заказов со статусом
pending,cancelled,failed. - Запустите вручную функцию, добавив временный вызов:
wpcoder_delete_old_wc_orders();в functions.php, чтобы проверить удаление. - Проверьте в базе данных таблицу
wp_posts(тип записиshop_order), что старые заказы удалены. - Убедитесь, что WP-Cron запланирован: в плагине WP Crontrol или через команду WP-CLI
wp cron event list.
Частые ошибки и как их исправить
- Код не запускается регулярно: проверьте, что WP-Cron работает, на сайтах с низкой посещаемостью cron может не запускаться. Используйте системный cron для вызова
wp-cron.php. - Удаление заказов не происходит: возможно, статус заказа не совпадает с указанными. Проверьте, какие статусы используются на вашем сайте, например, через
wc_get_order_statuses(). - Удаляются нужные заказы: будьте осторожны с условиями даты и статусами, настраивайте фильтр под свои нужды, чтобы не потерять важные данные.
- Ошибка «функция wc_get_orders не найдена»: убедитесь, что WooCommerce активен, и код запускается после инициализации плагина (например, на хуке
init).
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами заказов используйте пагинацию при выборке заказов, чтобы избежать перегрузки памяти.
- Перед удалением заказов можно создавать резервные копии базы данных или экспортировать данные заказов.
- В случаях необходимости сохранять историю — используйте архивирование, например, переносите старые заказы в отдельную таблицу.
- Отключайте WP-Cron и настраивайте системный cron на серверах с низкой посещаемостью для надёжности.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WP Clear Orders) | Простота установки, готовый интерфейс | Может быть избыточным, нагрузка на сайт |
| Код в functions.php | Полный контроль, нет лишних функций | Требует знаний, возможны ошибки при обновлениях темы |
| Отдельный плагин с кастомным кодом | Безопасно, сохраняется при обновлениях | Нужно создавать и поддерживать |