Диагностика проблемы: зачем удалять файлы после отмены заказов в WooCommerce
В WooCommerce часто используется загрузка файлов пользователями — например, для кастомизации товаров, загрузки документов или цифровых товаров. Если заказ отменяется, файлы, загруженные в рамках этого заказа, остаются на сервере, занимая место и создавая потенциальную угрозу безопасности.
Нужно автоматизировать удаление этих файлов, чтобы не накапливать «мусор» и не открывать доступ к ненужным данным.
Пошаговое решение: удаление файлов по событию отмены заказа
1. Определяем событие отмены заказа
WooCommerce эмитирует хук woocommerce_order_status_cancelled при смене статуса заказа на «отменён». Этот хук можно использовать для запуска функции удаления файлов.
2. Получаем файлы, связанные с заказом
Файлы обычно хранятся как мета-данные к заказу или к товарам в заказе. Нужно точно знать, где хранится путь к файлу. Рассмотрим пример, когда путь к файлу хранится в мета-данных заказа с ключом _custom_upload_path.
3. Удаляем файлы с сервера
Используем стандартные PHP-функции для удаления файлов, предварительно проверяя наличие файла и безопасность пути.
add_action('woocommerce_order_status_cancelled', 'wpupload_delete_uploaded_files_after_cancel', 10, 1);
function wpupload_delete_uploaded_files_after_cancel($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Получаем массив путей к загруженным файлам из мета заказа
$file_paths = $order->get_meta('_custom_upload_paths'); // например, массив путей
if (empty($file_paths) || !is_array($file_paths)) return;
foreach ($file_paths as $file_path) {
// Безопасная проверка пути
$upload_dir = wp_get_upload_dir();
$base_dir = $upload_dir['basedir'];
$full_path = realpath($file_path);
if ($full_path && strpos($full_path, $base_dir) === 0 && file_exists($full_path)) {
unlink($full_path); // удаляем файл
}
}
// Опционально: очищаем мета по файлам, чтобы не было ссылок
$order->delete_meta_data('_custom_upload_paths');
$order->save();
}
Проверка результата после внедрения
- Создайте тестовый заказ с загрузкой файлов, убедитесь, что путь к файлам сохраняется в мета
_custom_upload_paths. - Отмените заказ через админку WooCommerce.
- Проверьте, что файлы по указанным путям удалены с сервера.
- Проверьте, что мета данные заказа с путями файлов удалены.
- Логи сервера и ошибки PHP не должны содержать сообщений об ошибках удаления.
Частые ошибки и как их исправить
- Файлы не удаляются: Проверьте правильность путей в мета данных и права доступа на сервере. PHP-процесс должен иметь право на удаление файлов.
- Удаляются не те файлы: Используйте
realpath()и проверку вхождения пути вwp_get_upload_dir()['basedir']для безопасности. - Функция не вызывается: Убедитесь, что хук
woocommerce_order_status_cancelledсрабатывает. Можно добавить логирование или временноerror_log()внутри функции. - Мета данные не содержат пути: Проверьте, что при загрузке файлов пути корректно сохраняются в заказ.
Практические советы по безопасности и производительности
- Всегда проверяйте полный путь к файлу через
realpath()и убеждайтесь, что он находится в папке загрузок WordPress (wp-content/uploads), чтобы исключить удаление критичных системных файлов. - Сохраняйте пути к файлам в виде относительных путей или используя API WordPress для лучшей переносимости и безопасности.
- Удаление файлов стоит выполнять в момент смены статуса, чтобы не создавать дополнительную нагрузку на сервер в фоне.
- Если файлов много, подумайте о пакетной обработке с WP_Cron для снижения нагрузки.
Альтернативы: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
| Самописный код (хук и функция) | Легковесность, контроль, отсутствие лишних плагинов, гибкость под свои нужды | Требует навыков PHP, можно допустить ошибки, поддержка на вас |
| Плагин для очистки WooCommerce | Простота установки, поддержка разработчиков, функционал сразу готов | Может быть избыточным, не всегда гибким, нагрузка, совместимость |