Диагностика проблемы: почему файлы остаются после отмены заказа
В WooCommerce при отмене заказа загруженные пользователем файлы (например, для цифровых товаров или кастомных загрузок) часто не удаляются автоматически. Это приводит к накоплению ненужных файлов на сервере, увеличению занимаемого дискового пространства и потенциальным проблемам с безопасностью. Чтобы решить эту задачу без использования плагинов, нужно вручную реализовать логику удаления файлов, связанные с отменёнными заказами.
Пошаговое решение: удаление загруженных файлов после отмены заказа
1. Определяем нужный хук для отслеживания отмены заказа
WooCommerce генерирует несколько статусов заказа: pending, processing, completed, cancelled, refunded и др. Нам интересен статус cancelled.
Для отслеживания смены статуса заказа используем хук woocommerce_order_status_cancelled — он срабатывает именно при переходе заказа в статус отменён.
2. Получаем файлы, связанные с заказом
Загруженные пользователем файлы могут храниться в мета-данных заказа или его товаров, в зависимости от реализации. Например, если файл хранится в мета-данных заказа под ключом _custom_uploaded_files и содержит массив путей к файлам.
3. Удаляем файлы программно
Напишем функцию, которая при отмене заказа получит пути к файлам и удалит их с диска, а также очистит мета-данные заказа.
add_action('woocommerce_order_status_cancelled', 'wpupload_delete_files_after_order_cancelled');
function wpupload_delete_files_after_order_cancelled($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Получаем мета-данные с файлами
$uploaded_files = get_post_meta($order_id, '_custom_uploaded_files', true);
if (!empty($uploaded_files) && is_array($uploaded_files)) {
foreach ($uploaded_files as $file_path) {
// Проверяем, что файл существует и удаляем
if (file_exists($file_path)) {
@unlink($file_path); // подавляем ошибки при удалении
}
}
// Очищаем мета-данные после удаления
delete_post_meta($order_id, '_custom_uploaded_files');
}
}
Проверка результата после внедрения
- Создайте заказ с загрузкой файлов, которые сохраняются в мета данных
_custom_uploaded_files. - Отмените заказ через админку WooCommerce.
- Проверьте, что файлы физически удалены из папки на сервере.
- Проверьте, что мета-данные
_custom_uploaded_filesдля заказа удалены. - Для отладки можно временно добавить логирование в функцию, например, через
error_log().
Частые ошибки и как их исправить
- Путь к файлу не полный или относительный
Проверьте, что в мета данных хранится полный путь к файлу, например,/var/www/site/wp-content/uploads/.... Если путь относительный, допишите корневую папку сайта черезABSPATH. - Файлы не удаляются из-за прав доступа
Убедитесь, что пользователь веб-сервера имеет права на удаление файлов в папке загрузок. - Функция не вызывается
Проверьте, что хукwoocommerce_order_status_cancelledпривязан корректно, и что статус заказа действительно меняется наcancelled. - Файлы хранятся не в мета данных заказа
Если файлы привязаны к товарам или в пользовательских таблицах, адаптируйте код для получения путей.
Практические советы по безопасности и производительности
- Удаляйте только файлы из папки загрузок WordPress, чтобы избежать удаления системных файлов.
- Добавьте проверку на расширения и MIME типы файлов перед удалением для дополнительной безопасности.
- Не используйте
@unlinkбез обработки ошибок — можно добавить логирование с уведомлением об ошибках. - Если файлов много, рассмотрите удаление по очереди через wp_cron, чтобы не перегружать сервер.
- Обязательно делайте резервные копии перед массовыми удалениями файлов.
Сравнение подходов: плагин vs код vs компромисс
| Метод | Преимущества | Недостатки |
|---|---|---|
| Готовый плагин | Быстрая настройка, готовый интерфейс, поддержка | Дополнительная нагрузка, возможные конфликты, не всегда подходит под индивидуальные задачи |
| Код без плагинов (как в статье) | Контроль над процессом, легковесность, гибкость | Требует навыков разработки, нуждается в тестировании, поддержке |
| Компромисс: минимальный плагин + кастомный код | Часть функций реализована, можно расширять | Сложнее поддерживать, возможна избыточность |
Использование кода позволяет встроить удаление файлов в бизнес-логику WooCommerce без лишних плагинов и повысить безопасность и чистоту вашего сайта.
Дополнительный пример: удаление файлов из пользовательских заказов с мета данными товаров
add_action('woocommerce_order_status_cancelled', 'wpupload_delete_product_files_after_cancel');
function wpupload_delete_product_files_after_cancel($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item_id => $item) {
$files = wc_get_order_item_meta($item_id, '_custom_uploaded_files', true);
if (!empty($files) && is_array($files)) {
foreach ($files as $file_path) {
if (file_exists($file_path)) {
@unlink($file_path);
}
}
wc_delete_order_item_meta($item_id, '_custom_uploaded_files');
}
}
}