Диагностика проблемы: зачем удалять файлы после отмены заказа
При продаже цифровых товаров в WooCommerce часто возникает задача удаления загруженных файлов, если заказ был отменён или не оплачен. Без автоматизации такие файлы остаются на сервере и занимают место, что может привести к переполнению хранилища и путанице в управлении медиаконтентом.
Пошаговое решение: удаление файлов через хук отмены заказа
WooCommerce сохраняет ссылки на загруженные файлы цифровых товаров в мета-данных заказа. Для удаления файлов после отмены заказа можно использовать хук woocommerce_order_status_cancelled. Ниже пример, как реализовать удаление файлов без плагинов:
add_action('woocommerce_order_status_cancelled', 'wpupload_delete_files_after_order_cancelled', 10, 1);
function wpupload_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_id => $item) {
$product = $item->get_product();
if (!$product) {
continue;
}
// Получаем данные загрузок (для цифровых товаров)
$downloads = $product->get_downloads();
if (empty($downloads)) {
continue;
}
// В метаданных элемента заказа хранятся ссылки на загруженные пользователем файлы
$files = $item->get_meta('_wpupload_user_files'); // пример ключа метаданных
if (!empty($files) && is_array($files)) {
foreach ($files as $file_path) {
// Полный путь к файлу на сервере
$upload_dir = wp_upload_dir();
$full_path = $upload_dir['basedir'] . '/' . ltrim($file_path, '/');
if (file_exists($full_path)) {
unlink($full_path); // удаляем файл
}
}
// Очищаем мета, чтобы не оставлять ссылки
$item->delete_meta_data('_wpupload_user_files');
$item->save();
}
}
}Объяснение кода
woocommerce_order_status_cancelled– хук срабатывает при смене статуса заказа на «Отменён».- В цикле проходим по позициям заказа и проверяем, есть ли пользовательские загруженные файлы.
- Удаляем файлы с диска и очищаем метаданные, чтобы не оставлять мусор.
Проверка результата после внедрения
- Создайте тестовый заказ с цифровым товаром, который требует загрузки файлов.
- Загрузите файлы в заказ и завершите оформление с любым статусом, кроме отменённого.
- В админке WooCommerce отмените заказ.
- Проверьте, что файлы удалились из папки
/wp-content/uploads/и метаданные заказа очищены. - Для контроля можно добавить логирование удаления файлов через
error_log()или использовать плагин типа Query Monitor.
Частые ошибки и как их исправить
- Файлы не удаляются: проверьте права доступа к папке uploads, сервер должен позволять PHP удалять файлы.
- Неверный путь к файлам: убедитесь, что в мета-данных хранится относительный путь, а не URL. Используйте
wp_upload_dir()['basedir']для составления полного пути. - Отсутствуют метаданные с файлами: убедитесь, что ключ мета-данных совпадает с тем, что используется при сохранении файлов в заказе.
- Хук не срабатывает: проверьте, что функция подключена в functions.php или в плагине, и что не конфликтуют другие хуки, которые меняют статус заказа.
Практические советы по безопасности и производительности
- Перед удалением файла убедитесь, что путь находится внутри директории uploads, чтобы избежать удаления системных файлов.
- Используйте функцию
realpath()и проверяйте, что путь начинается сwp_upload_dir()['basedir']. - Добавьте логирование ошибок удаления для отладки в рабочей среде.
- Если файлов много, рассмотрите удаление в фоне (через WP-Cron), чтобы не блокировать обработку статуса заказа.
Сравнение вариантов удаления файлов после отмены заказа
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Трудозатратно, легко забыть |
| Плагин с автоматическим удалением | Автоматизация, удобство | Дополнительная нагрузка, возможные конфликты |
| Код на хуке статуса (наш способ) | Лёгкая кастомизация, без лишних плагинов | Требует разработки и тестирования |