Диагностика проблемы: зачем удалять файлы после отмены заказа
В WooCommerce при продаже цифровых товаров покупатель получает доступ к файлам, которые загружаются через интерфейс администрирования товара. Если заказ отменяется или отклоняется, файлы остаются на сервере, занимая место и создавая потенциальные риски безопасности, если доступ к ним не ограничен. Автоматическое удаление таких файлов помогает поддерживать чистоту хранилища и снижает нагрузку на сервер.
Как WooCommerce хранит загруженные файлы
Файлы для цифровых товаров в WooCommerce обычно хранятся в папке uploads WordPress и связаны с заказом через мета-данные, например _downloadable_files для товара. Для удаления файлов после отмены заказа надо получить путь к этим файлам из данных заказа.
Пошаговое решение: автоматическое удаление файлов после отмены заказа
1. Подключаемся к хуку отмены заказа
WooCommerce имеет хук woocommerce_order_status_cancelled, который срабатывает при смене статуса заказа на «отменён».
add_action('woocommerce_order_status_cancelled', 'wpupload_delete_files_after_cancel', 10, 1);2. Получаем все загруженные файлы из заказа
В функции нужно перебрать товары заказа, найти связанные с ними цифровые файлы и получить абсолютные пути к ним.
function wpupload_delete_files_after_cancel($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if (!$product || ! $product->is_downloadable()) continue;
$files = $product->get_downloads();
foreach ($files as $file) {
$file_path = wpupload_get_file_path($file->get_file());
if ($file_path && file_exists($file_path)) {
unlink($file_path); // удаляем файл
}
}
}
}3. Получение локального пути к файлу
URL файлов может быть абсолютным или относительным. Нужно конвертировать URL в путь на сервере.
function wpupload_get_file_path($file_url) {
$upload_dir = wp_upload_dir();
$base_url = $upload_dir['baseurl'];
$base_dir = $upload_dir['basedir'];
if (strpos($file_url, $base_url) === 0) {
$relative_path = substr($file_url, strlen($base_url));
return $base_dir . $relative_path;
}
// Если файл вне uploads, попробуйте распарсить URL
$parsed = wp_parse_url($file_url);
if (!empty($parsed['path'])) {
return ABSPATH . ltrim($parsed['path'], '/');
}
return false;
}Проверка результата после внедрения
- Создайте тестовый цифровой товар и добавьте файл для загрузки.
- Оформите заказ и оплатите его.
- Отмените заказ в админке WooCommerce.
- Проверьте, что файл в папке
uploadsудалён. - Если файл остался — проверьте логи ошибок PHP и права доступа на папки.
Частые ошибки и как их исправить
- Файл не удаляется — нет прав на запись: Убедитесь, что пользователь под которым работает PHP, имеет права на удаление файлов в папке
wp-content/uploads. - Пути к файлам не совпадают: Проверьте, что URL файлов в заказе совпадают с реальным расположением. Иногда плагины меняют структуру ссылок.
- Функция вызывается не для всех статусов: Если вам нужны другие статусы отмены, добавьте хуки дополнительно, например
woocommerce_order_status_failed. - Удаляются не те файлы: Проверьте, что функция удаляет только файлы цифровых товаров из конкретного заказа, чтобы не затронуть общие или системные файлы.
Практические советы по безопасности и производительности
- Добавьте логирование удалений файлов для аудита — например, в отдельный файл или системный лог.
- Используйте транзакции или отложенное удаление через WP Cron, если на сайте много заказов, чтобы избежать блокировки сервера.
- Проверьте, что удаление файлов не мешает восстановлению заказов или повторной активации доступа.
- Регулярно делайте резервные копии каталога
uploads, чтобы избежать потери данных.
Сравнение вариантов удаления файлов
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Код на хуке отмены заказа | Контроль, без лишних плагинов, легко кастомизировать | Требует навыков, может не учитывать все сценарии | Пример из статьи |
| Плагин для очистки файлов | Простая установка, готовые функции | Дополнительная нагрузка, ограниченная кастомизация | Плагины типа "WooCommerce File Cleaner" |
| Отложенное удаление через WP Cron | Безопасно для нагрузки, можно настроить расписание | Сложнее реализовать, задержка удаления | Добавление задач в WP Cron |