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

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

В WooCommerce часто используется загрузка файлов покупателями (например, для печати, кастомизации или подтверждения). При отмене или возврате заказа логично удалить эти файлы, чтобы не захламлять сервер и не создавать проблемы с безопасностью.

По умолчанию WooCommerce не удаляет загруженные файлы автоматически после отмены заказа, так как не знает, что делать с медиа. Это приводит к накоплению ненужных данных на сервере.

Как проверить, что файлы не удаляются автоматически

  • Создайте тестовый заказ с загрузкой файла.
  • Отмените заказ через админпанель WooCommerce.
  • Проверьте папку wp-content/uploads/woocommerce_uploads или используемый путь хранения файлов.
  • Если файлы остались, значит, автоматического удаления нет.

Пошаговое решение: автоматическое удаление файлов при отмене заказа

Реализуем удаление файлов через хук woocommerce_order_status_cancelled, который срабатывает при смене статуса заказа на отменён.

add_action('woocommerce_order_status_cancelled', 'delete_uploaded_files_on_order_cancelled');
function delete_uploaded_files_on_order_cancelled($order_id) {
    if (!$order_id) return;

    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if (!$product) continue;

        // Предполагаем, что файл загружается как пользовательское поле заказа
        $uploaded_file = $item->get_meta('uploaded_file'); // ключ мета зависит от реализации загрузки
        if ($uploaded_file && file_exists(ABSPATH . $uploaded_file)) {
            unlink(ABSPATH . $uploaded_file); // удаляем файл
        }
    }
}

В этом примере предполагается, что путь к файлу сохраняется в мета-данных позиции заказа с ключом uploaded_file. Если у вас другая структура хранения, подкорректируйте путь.

Добавление удаления из медиабиблиотеки (если файл привязан к медиафайлу WordPress)

add_action('woocommerce_order_status_cancelled', 'delete_media_attachment_on_order_cancelled');
function delete_media_attachment_on_order_cancelled($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    foreach ($order->get_items() as $item) {
        $attachment_id = $item->get_meta('uploaded_file_attachment_id');
        if ($attachment_id && get_post_type($attachment_id) === 'attachment') {
            wp_delete_attachment($attachment_id, true); // Полное удаление
        }
    }
}

Проверка результата после внедрения кода

  • Создайте тестовый заказ с загрузкой файла.
  • Убедитесь, что мета-данные с путём или ID вложения корректно сохраняются.
  • Отмените заказ в WooCommerce.
  • Проверьте, что файл исчез из папки uploads и/или удалён из медиабиблиотеки.
  • Проверьте логи ошибок сервера на предмет проблем с правами доступа.

Частые ошибки и как их исправить

  • Файлы не удаляются: проверьте правильность пути к файлу и права на запись/удаление в папке uploads.
  • Метаданные не содержат путь: убедитесь, что загрузка файлов сохраняет данные в мета-данных заказа или позиций.
  • Удаление файлов вызывает ошибки безопасности: используйте ABSPATH для абсолютного пути и проверяйте, что файл находится внутри папки uploads, чтобы избежать удаления системных файлов.
  • Файл удаляется, но не из медиатеки: используйте функцию wp_delete_attachment с параметром true для полного удаления вложения.

Практические советы по безопасности и производительности

  • Всегда проверяйте, что удаляемый файл находится в пределах папки uploads, чтобы избежать случайного удаления системных или пользовательских файлов.
  • Резервное копирование медиа перед массовым удалением поможет избежать потери важных данных.
  • Если у вас большой объем заказов с файлами, реализуйте удаление файлов через очередь фоновых задач (WP Cron или сторонние задачи), чтобы не блокировать выполнение запроса.
  • Для повышения безопасности используйте проверку прав пользователя, чтобы только администраторы могли выполнять отмену заказов и запускать удаление.

Сравнение способов удаления файлов

МетодОписаниеПлюсыМинусы
Удаление по пути файла из метаданных Удаление напрямую с диска через PHP unlink Простой и быстрый Требует точного пути; риск удаления неправильных файлов
Удаление через wp_delete_attachment Удаление файла и записи из медиатеки WordPress Полное удаление, учитывает все связи Файл должен быть загружен в медиатеку; сложнее реализовать
Удаление через плагин (например, Clearfy Pro) Автоматизация и расширенные настройки Удобство и безопасность; дополнительные функции Может быть платным; лишний слой абстракции
Как использовать WP Remote POST для отправки данных с формы в WordPress
03.03.2026
Как отладить проблемы загрузки файлов в WordPress с помощью WPUpload
22.02.2026
Как разделить загрузку и хранение файлов в WordPress для оптимизации и безопасности
13.01.2026
Система отложенной загрузки файлов в WordPress: подробное руководство
30.03.2026
Как автоматически оптимизировать изображения при загрузке в WordPress
25.12.2025

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