Диагностика проблемы: почему файлы остаются после отмены заказа в WooCommerce
В стандартной установке WooCommerce загруженные пользователем файлы, связанные с заказом (например, при покупке цифровых товаров с загрузкой), не удаляются автоматически при отмене заказа. Это приводит к накоплению ненужных файлов на сервере, что может вызвать проблемы с дисковым пространством и безопасностью.
Чтобы проверить, связаны ли файлы с отменёнными заказами, необходимо:
- Определить, какие файлы прикреплены к заказам с помощью метаданных заказа.
- Проверить статус заказов — отменён или нет.
- Просмотреть папку загрузок WooCommerce на сервере на предмет файлов, относящихся к отменённым заказам.
Пошаговое решение: удаление файлов после отмены заказа через хук WooCommerce
Для автоматического удаления файлов при смене статуса заказа на отменён можно использовать хук woocommerce_order_status_cancelled. Ниже пример кода, который удаляет все загруженные файлы, связанные с отменённым заказом.
add_action('woocommerce_order_status_cancelled', 'wpupload_delete_files_on_order_cancelled');
function wpupload_delete_files_on_order_cancelled($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product();
if (!$product) continue;
// Проверяем, есть ли загруженные файлы для данного товара
$downloads = $product->get_downloads();
if (empty($downloads)) continue;
foreach ($downloads as $download) {
// Получаем путь к файлу
$file_path = get_attached_file($download->get_id());
if (!$file_path) continue;
// Проверяем, существует ли файл и удаляем
if (file_exists($file_path)) {
unlink($file_path);
}
}
}
}Объяснение:
- Хук срабатывает при смене статуса заказа на отменён.
- Цикл перебирает позиции заказа, для каждого товара получает файлы для скачивания.
- Далее для каждого файла определяет путь на сервере и удаляет его с помощью
unlink().
Улучшение: удаление пользовательских загруженных файлов
Если файлы загружаются пользователями и сохраняются в метаданных заказа, например, под ключом _user_uploaded_file, то можно добавить дополнительный код для их удаления:
add_action('woocommerce_order_status_cancelled', 'wpupload_delete_user_files_on_cancelled');
function wpupload_delete_user_files_on_cancelled($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$user_files = get_post_meta($order_id, '_user_uploaded_file', true);
if (empty($user_files)) return;
// В случае, если это массив
if (!is_array($user_files)) {
$user_files = array($user_files);
}
foreach ($user_files as $file_url) {
$file_path = str_replace(site_url('/'), ABSPATH, $file_url);
if (file_exists($file_path)) {
unlink($file_path);
}
}
}Проверка результата после внедрения
Чтобы убедиться, что файлы удаляются корректно:
- Создайте тестовый заказ с загруженными файлами.
- Отмените заказ через админ-панель WooCommerce.
- Проверьте, что файлы, связанные с заказом, исчезли с сервера (через FTP или файловый менеджер хостинга).
- Проверьте логи ошибок PHP на предмет предупреждений или ошибок
unlink().
Частые ошибки и как их исправить
- Файлы не удаляются: Проверьте права доступа к файлам и папкам на сервере. PHP должен иметь права на удаление файлов.
- Некорректный путь к файлу: Функция
get_attached_file()может вернуть неправильный путь, если используется стороннее хранилище. В этом случае надо корректировать путь вручную или использовать API хранилища. - Удаление важных файлов: Убедитесь, что удаляются только файлы, относящиеся к конкретному заказу. Не используйте глобальные пути.
- Код не срабатывает при изменении статуса: Проверьте, что в WooCommerce действительно меняется статус на
cancelled, а не наfailedилиrefunded. При необходимости подключите аналогичные хуки.
Практические советы по безопасности и производительности
- Перед удалением файла проверяйте, что он находится в пределах папки uploads или специально выделенной директории для загруженных файлов. Это защитит от удаления системных файлов.
- Для больших сайтов с множеством заказов и файлов целесообразно выполнять удаление асинхронно через WP-Cron или фоновые задачи, чтобы не замедлять обработку заказов.
- Регулярно делайте резервные копии файлов и базы данных перед внедрением автоматического удаления.
- Логируйте удаление файлов с датой и ID заказа для аудита и отладки.
Сравнение вариантов реализации удаления файлов после отмены заказа
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Код на хуке woocommerce_order_status_cancelled | Лёгкий контроль, без плагинов, гибкость | Требует разработчика, возможны ошибки с правами доступа | Если нужен точечный контроль и кастомизация |
| Плагины для очистки файлов | Простота установки и настройки | Могут создавать нагрузку, не всегда гибкие | Для быстрых решений без программирования |
| Внешние скрипты / cron задачи | Масштабируемо, не нагружает сайт | Сложнее настройка, требует серверных навыков | Для крупных магазинов с большим объёмом данных |