Диагностика проблемы: зачем и когда нужно удалять заказы автоматически
В стандартном функционале WooCommerce нет автоматического удаления заказов после определённого срока. Это приводит к разрастанию базы данных, снижению производительности и усложнению администрирования. Особенно актуально для магазинов с большим оборотом и большим количеством заказов, которые уже неактуальны и не нужны в базе.
Типовые сценарии, когда полезна автоматизация удаления заказов:
- Удаление завершённых или отменённых заказов старше 30 дней;
- Автоматическая очистка базы от неоплаченных или отменённых заказов с целью уменьшения нагрузки;
- Поддержание порядка без ручного вмешательства.
Пошаговое решение: как настроить автоматическое удаление заказов через 30 дней
1. Создание функции для удаления заказов
Добавим в functions.php вашей темы (или в отдельный плагин) следующий код, который будет удалять заказы старше 30 дней со статусом 'completed' или 'cancelled'. Важно, чтобы удаление было безопасным и с подтверждением в логах.
function wps_remove_old_woocommerce_orders() {
// Параметры даты - заказы до 30 дней назад
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime('-30 days')),
);
// Статусы заказов для удаления
$statuses = array('completed', 'cancelled');
foreach ($statuses as $status) {
$args = array(
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'date_query' => array($date_query),
'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($order_id, true) для полного удаления
error_log('WooCommerce: удалён заказ ID ' . $order_id . ' со статусом ' . $status);
}
}
}
}
2. Настройка WP-Cron для регулярного запуска
Добавим событие в планировщик задач WordPress для запуска функции раз в сутки:
function wps_schedule_order_cleanup() {
if (!wp_next_scheduled('wps_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wps_daily_order_cleanup');
}
}
add_action('wp', 'wps_schedule_order_cleanup');
add_action('wps_daily_order_cleanup', 'wps_remove_old_woocommerce_orders');
3. Очистка планировщика при деактивации темы или плагина
function wps_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wps_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wps_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wps_clear_order_cleanup_schedule');
Проверка результата после внедрения
Чтобы проверить работу автоматического удаления:
- Создайте тестовый заказ с нужным статусом (completed или cancelled) и датой старше 30 дней (можно изменить дату вручную в базе или через плагины).
- Вручную запустите функцию
wps_remove_old_woocommerce_orders()из консоли WP-CLI (wp eval 'wps_remove_old_woocommerce_orders();'), или временно вызовите её в шаблоне. - Проверьте, что заказ перенесён в корзину или удалён, а в
debug.logпоявились записи об удалении. - Убедитесь, что при следующем запуске WP-Cron (например, с помощью плагина WP Crontrol) заказы старше 30 дней удаляются автоматически.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте статус заказов, они должны быть именно с префиксом
wc-в post_status (например,wc-completed), и дата должна быть корректной. - Функция не запускается по расписанию: убедитесь, что WP-Cron работает на сервере или настройте реальный системный cron для wp-cron.php.
- Удаление происходит слишком быстро или слишком медленно: при большом количестве заказов стоит добавлять лимит по количеству удаляемых заказов за раз и запускать функцию несколько раз, чтобы не нагружать сервер.
- Удалённые заказы нельзя восстановить: используйте
wp_trash_post()вместоwp_delete_post(), чтобы иметь возможность восстановить заказы из корзины.
Практические советы по безопасности и производительности
- Запускайте удаление в off-peak часы, чтобы минимизировать влияние на производительность сайта.
- Создавайте резервные копии базы перед внедрением автоматического удаления.
- Логируйте удаление заказов в отдельный файл для аудита и восстановления при ошибках.
- Если база очень большая, разбивайте удаление на порции с помощью параметра
posts_per_pageи передавайте оффсет. - По возможности внедряйте очистку на уровне сервера (SQL-запросы), но аккуратно, чтобы не повредить связанные данные.
Сравнение методов удаления заказов в WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| wp_trash_post() | Перемещает заказ в корзину (trash) | Безопасно, можно восстановить | Не освобождает место сразу |
| wp_delete_post(true) | Удаляет заказ безвозвратно | Освобождает место в базе | Нельзя восстановить, риск потери данных |
| SQL-запросы напрямую | Удаление через SQL (напр. DELETE из wp_posts и wp_postmeta) | Быстро при больших объёмах | Риск повреждения данных, требует опыта |