Автоматическое удаление файлов WooCommerce после отмены заказа без плагинов

Диагностика проблемы: зачем удалять файлы после отмены заказа

При продаже цифровых товаров в 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), чтобы не блокировать обработку статуса заказа.

Сравнение вариантов удаления файлов после отмены заказа

МетодПлюсыМинусы
Ручное удаление через админкуПростота, не требует кодаТрудозатратно, легко забыть
Плагин с автоматическим удалениемАвтоматизация, удобствоДополнительная нагрузка, возможные конфликты
Код на хуке статуса (наш способ)Лёгкая кастомизация, без лишних плагиновТребует разработки и тестирования
Удаление неиспользуемых файлов в медиабиблиотеке WordPress без плагинов
04.07.2026
Как автоматически отклонять загрузку файлов по типам в WordPress
24.06.2026
Как автоматически удалять файлы WooCommerce после отмены заказа
21.05.2026
Как защитить WooCommerce от нежелательных загрузок файлов
27.06.2026
Строгий контроль остатков товаров в WooCommerce с уведомлениями
20.04.2026

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