Как удалить загруженные файлы из WooCommerce после отмены заказа

Диагностика проблемы: зачем удалять файлы после отмены заказа в 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 или админкуНикаких изменений в коде, полный контрольТрудоемко, риск удалить нужные файлы
Как отключить Gutenberg и вернуть классический редактор в WordPress
06.04.2026
Как добавить автоматическое сжатие файлов при загрузке в WordPress
12.02.2026
Как добавить проверку вирусов при загрузке файлов в WordPress
26.03.2026
Как отладить проблемы загрузки файлов в WordPress с помощью WPUpload
22.02.2026
Как использовать WP Filesystem API для работы с файлами в WordPress
16.04.2026

wp upload - это директория в WP для загрузки файлов. Подробнее про загрузку файлов в админку можно почитать на этой странице.