Диагностика проблемы: зачем удалять файлы после отмены заказа в WooCommerce
При использовании WooCommerce для продажи товаров с загрузками (например, цифровых товаров, документов или лицензий) часто возникает необходимость удалять файлы, загруженные покупателями, если заказ отменяется. Это помогает освободить место на сервере, предотвратить случайный доступ к файлам и поддерживать порядок в каталоге загрузок.
Без автоматического удаления файлов файлы могут накапливаться, создавая риски безопасности и занимая дисковое пространство.
Как определить, что файлы не удаляются автоматически
- Проверить папку загрузок WooCommerce (обычно
wp-content/uploads/woocommerce_uploads/) на наличие файлов, связанных с отменёнными заказами. - Сравнить дату отмены заказа с датой создания файлов.
- Посмотреть в админке WooCommerce, есть ли задачи по удалению файлов (если используются сторонние плагины).
Пошаговое решение: добавляем автоматическое удаление файлов при отмене заказа
WooCommerce по умолчанию не удаляет загруженные файлы при отмене заказа. Для этого можно использовать хук woocommerce_order_status_cancelled, который срабатывает при изменении статуса заказа на "отменён".
Реализуем функцию, которая по отмене заказа удалит все файлы из пользовательских загрузок:
add_action('woocommerce_order_status_cancelled', 'remove_uploaded_files_after_cancelled_order');
function remove_uploaded_files_after_cancelled_order($order_id) {
$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;
// Получаем данные загрузок в заказе
$meta = wc_get_order_item_meta($item_id, '_downloadable_files', true);
if (empty($meta) || !is_array($meta)) continue;
foreach ($meta as $file_key => $file_url) {
// Преобразуем URL в путь на сервере
$upload_dir = wp_upload_dir();
$base_dir = trailingslashit($upload_dir['basedir']);
$file_path = str_replace($upload_dir['baseurl'], $base_dir, $file_url);
if (file_exists($file_path)) {
@unlink($file_path);
}
}
}
}Объяснение кода:
- Хук
woocommerce_order_status_cancelledзапускает функцию при отмене заказа. - Собираются позиции заказа и проверяется наличие загружаемых файлов.
- Из метаданных заказа извлекаются ссылки на загруженные файлы.
- Преобразуется URL в физический путь на сервере и файл удаляется.
Альтернативный способ: удалять файлы при статусе "отменён" и "возврат"
Для расширения функционала можно добавить удаление файлов и при возврате заказа:
add_action('woocommerce_order_status_refunded', 'remove_uploaded_files_after_cancelled_order');Проверка результата после внедрения
- Создайте тестовый заказ с загрузочным товаром.
- Загрузите файл через форму заказа.
- Отмените заказ в админке WooCommerce.
- Проверьте, что файл физически удалён из папки загрузок (
wp-content/uploads/woocommerce_uploads/). - Если файл остался, проверьте логи ошибок PHP и права доступа к файлам.
Частые ошибки и как их исправить
- Файлы не удаляются: Проверьте права доступа к папке uploads и файлам, убедитесь, что PHP-процесс может удалять файлы.
- Метаданные заказа пусты: Если в метаданных нет ссылок на файлы, возможно, товар неправильно настроен как загружаемый или файлы не прикреплены корректно.
- Удаляются не те файлы: Внимательно проверьте преобразование URL в путь. Используйте функции
wp_upload_dir()для правильного определения путей. - Ошибка PHP: Используйте
error_logили включите WP_DEBUG для отладки.
Практические советы по безопасности и производительности
- Перед удалением файла можно делать резервное копирование или перемещать файл в карантинную папку.
- Добавляйте логирование удалений, чтобы отслеживать операции и быстро реагировать на ошибки.
- Регулярно проверяйте права доступа к папкам загрузок, чтобы избежать несанкционированного доступа.
- Для больших сайтов с множеством загрузок рассмотрите использование WP-CLI для массовой очистки файлов.
Сравнение способов удаления файлов после отмены заказа
| Способ | Преимущества | Недостатки |
|---|---|---|
Код на хук woocommerce_order_status_cancelled | Полный контроль, работает без плагинов, легко кастомизируется | Требуется навыки программирования, возможны ошибки при неправильной реализации |
| Сторонние плагины (например, автоматическое удаление файлов) | Простота установки и настройки, поддержка обновлений | Может замедлять сайт, не всегда подходит под кастомные задачи |
| Ручная очистка через FTP или админку | Никаких изменений в коде, полный контроль | Трудоемко, риск удалить нужные файлы |