Почему важно удалять файлы после отмены заказа в WooCommerce
В WooCommerce часто используются загружаемые товары или файлы, которые покупатель получает после оплаты. Если заказ отменяется, эти файлы должны быть удалены с сервера, чтобы избежать лишнего займа дискового пространства и возможных проблем с безопасностью. Автоматизация этого процесса избавляет от ручной работы и уменьшает риски.
Диагностика проблемы: файлы остаются после отмены заказа
Если вы заметили, что после отмены заказа файлы, связанные с этим заказом, не удаляются, следует проверить:
- Как хранятся файлы: в медиатеке или в отдельной директории.
- Используется ли стандартный тип продукта «Загружаемый» или кастомное поле.
- Есть ли в теме или плагинах кастомный код, который управляет удалением.
- Работает ли хук, срабатывающий при смене статуса заказа.
Пошаговое решение: код для автоматического удаления файлов после отмены заказа
WooCommerce позволяет отследить смену статуса заказа через хук woocommerce_order_status_changed. При переходе в статус «cancelled» можно получить список загруженных файлов и удалить их физически с диска.
Пример кода для functions.php вашей темы или в кастомном плагине:
add_action('woocommerce_order_status_changed', 'wpupload_delete_files_after_cancel', 10, 4);function wpupload_delete_files_after_cancel($order_id, $old_status, $new_status, $order) { if ($new_status === 'cancelled') { foreach ($order->get_items() as $item_id => $item) { $product = $item->get_product(); if (!$product->is_downloadable()) { continue; } $downloads = $product->get_downloads(); foreach ($downloads as $download) { $file_path = str_replace(wp_get_upload_dir()['baseurl'], wp_get_upload_dir()['basedir'], $download->get_file()); if (file_exists($file_path)) { unlink($file_path); } } } }}Этот код перебирает товары в заказе, проверяет, что они «загружаемые», и удаляет соответствующие файлы из папки uploads.
Объяснение ключевых моментов кода
woocommerce_order_status_changed— хук, вызываемый при смене статуса заказа.- Проверяем, что новый статус
cancelled(отменён). - Метод
get_downloads()возвращает список загружаемых файлов товара. - Путь к файлу конвертируется из URL в абсолютный путь на сервере.
- Удаление файла происходит функцией
unlink()при наличии файла.
Проверка результата после внедрения
Чтобы проверить, что скрипт работает:
- Создайте тестовый товар с загрузочным файлом.
- Оформите заказ и оплатите, убедитесь, что файл доступен для скачивания.
- Отмените заказ через админку WooCommerce.
- Проверьте, что файл удалён из папки uploads (через FTP или файловый менеджер хостинга).
- Ошибки можно отследить в логах сервера или включив WP_DEBUG в
wp-config.php.
Частые ошибки и как их исправить
- Файлы не удаляются: проверьте права доступа на папки uploads — PHP должен иметь право на удаление файлов.
- Файлы не находятся: путь к файлу формируется неправильно — проверьте, что URL файла корректно конвертируется в путь на сервере.
- Удаляются не те файлы: убедитесь, что вы работаете с файлами текущего заказа, а не с глобальными или кэшированными путями.
- Скрипт вызывает ошибки PHP: проверьте синтаксис, используйте логи и WP_DEBUG для отладки.
Практические советы по безопасности и производительности
- Всегда проверяйте, что файл принадлежит именно вашему сайту и расположен в папке uploads, чтобы избежать удаления случайных файлов вне каталога.
- Используйте
wp_get_upload_dir()для правильного определения путей. - Для больших сайтов с множеством заказов можно добавить очередь на удаление файлов через WP-Cron, чтобы не нагружать сервер сразу.
- Если ваши загрузки хранятся вне папки uploads — адаптируйте логику удаления, чтобы не удалять чужие данные.
Сравнение методов удаления файлов после отмены заказа
| Метод | Плюсы | Минусы |
|---|---|---|
Код на хуке woocommerce_order_status_changed | Гибкость, отсутствие плагинов, прямой контроль | Требует знаний PHP, можно допустить ошибки с безопасностью |
| Использование плагина (например, WooCommerce Download Manager) | Простота настройки, готовые функции | Потенциальный оверхед, зависимость от стороннего ПО |
| Ручное удаление через FTP или админку | Простота для небольших сайтов | Неавтоматично, риск пропуска файлов |