Проблема: накопление файлов после отмены заказов в WooCommerce
При продаже цифровых товаров или предоставлении файлов для скачивания через WooCommerce возникает ситуация, когда после отмены заказа файлы остаются на сервере. Это приводит к ненужному потреблению дискового пространства и потенциальным проблемам с безопасностью, если файлы доступны по прямой ссылке.
Диагностика проблемы
Чтобы понять, что файлы не удаляются, проверьте следующие моменты:
- В медиабиблиотеке WordPress или в папке
wp-content/uploadsостаются файлы, связанные с отменёнными заказами. - В настройках WooCommerce отсутствует автоматический механизм удаления файлов после отмены заказа.
- Файлы доступны по URL даже после отмены заказа, что может привести к несанкционированному доступу.
Пошаговое решение: удаление файлов после отмены заказа
WooCommerce не удаляет загруженные файлы автоматически при отмене заказа, поэтому нужно добавить кастомный код, который обработает событие отмены заказа и удалит связанные файлы.
1. Использование хука woocommerce_order_status_cancelled
Этот хук срабатывает при изменении статуса заказа на «отменён». Мы можем получить вложения цифровых товаров и удалить их из файловой системы.
2. Пример кода для functions.php вашей темы или в кастомном плагине
add_action('woocommerce_order_status_cancelled', 'delete_files_after_order_cancelled', 10, 1);
function delete_files_after_order_cancelled($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if (!$product) continue;
// Проверяем, есть ли цифровые файлы
$downloads = $product->get_downloads();
foreach ($downloads as $download) {
$file_path = str_replace(wp_upload_dir()['baseurl'], wp_upload_dir()['basedir'], $download->get_file());
if (file_exists($file_path)) {
unlink($file_path); // Удаляем файл
}
}
}
}Объяснение: код получает все цифровые загрузки в заказе, преобразует URL в путь на сервере и удаляет файлы, если они существуют.
Проверка результата после внедрения
- Создайте тестовый заказ с цифровым товаром и загрузите файл.
- Отмените заказ через панель администратора WooCommerce.
- Проверьте, что файл удалён из папки
uploads(например, через FTP или файловый менеджер хостинга). - Убедитесь, что файл недоступен по прежнему URL.
Частые ошибки и как их исправить
- Файлы не удаляются: проверьте права доступа на папку uploads, PHP должен иметь разрешение на удаление файлов.
- Некорректное определение пути к файлу: убедитесь, что
str_replaceправильно заменяет URL на путь, особенно если используется CDN или нестандартная структура. - Удаляются не те файлы: код удаляет только файлы цифровых загрузок из заказа — проверьте, что в товаре действительно настроены цифровые загрузки.
Практические советы по безопасности и производительности
- Перед удалением файла убедитесь, что он действительно принадлежит отменённому заказу, чтобы избежать удаления чужих данных.
- Добавьте логирование операций удаления — например, записывайте в отдельный файл логи успешных и неуспешных попыток удаления.
- Для больших магазинов с множеством заказов рассмотрите реализацию очередей для удаления файлов, чтобы не перегружать сервер в пиковые часы.
- Используйте Clearfy Pro для оптимизации и защиты сайта, включая управление кэшированием и правами доступа, что поможет дополнительно обезопасить загруженные файлы.
Сравнение способов удаления файлов после отмены заказа
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление | Простота, нет риска ошибочного кода | Трудозатратно, легко забыть, не подходит для больших магазинов |
| Кастомный код (хуки WooCommerce) | Автоматизация, точечное удаление нужных файлов | Требует тестирования, возможны ошибки при неправильных правах |
| Плагины для очистки файлов | Готовые решения, дополнительные функции | Может создавать нагрузку, не всегда точечное удаление |