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

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

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

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

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

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

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

Для решения задачи добавим кастомный код в файл functions.php вашей дочерней темы или в отдельный пользовательский плагин. Код будет отслеживать смену статуса заказа на cancelled и удалять все связанные с заказом файлы.

Шаг 1. Определяем, где хранятся файлы

Предположим, что загруженные пользователями файлы хранятся в метаполях заказа с ключом uploaded_files — это массив путей к файлам относительно wp-content/uploads. Если вы используете другой ключ, замените его в коде.

Шаг 2. Добавляем хук на смену статуса заказа

add_action('woocommerce_order_status_cancelled', 'wpupload_delete_files_after_cancelled_order');

function wpupload_delete_files_after_cancelled_order( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return;
    }

    // Получаем массив путей к файлам из метаполя
    $files = get_post_meta( $order_id, 'uploaded_files', true );

    if ( ! is_array( $files ) || empty( $files ) ) {
        return;
    }

    $upload_dir = wp_upload_dir();

    foreach ( $files as $file_path ) {
        // Формируем полный путь к файлу
        $full_path = trailingslashit( $upload_dir['basedir'] ) . ltrim( $file_path, '/');

        if ( file_exists( $full_path ) ) {
            unlink( $full_path );
        }
    }

    // Опционально: очистить метаполе, чтобы не хранить устаревшие данные
    delete_post_meta( $order_id, 'uploaded_files' );
}

Объяснение кода

  • Хук woocommerce_order_status_cancelled срабатывает при смене статуса на cancelled.
  • Из метаполя заказа извлекается массив файлов.
  • Каждый файл удаляется через unlink(), если существует.
  • Метаполе очищается для предотвращения повторных попыток удаления.

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

  • Создайте заказ с загрузкой файлов, которые сохраняются в метаполе uploaded_files.
  • Отмените заказ через админку WooCommerce.
  • Подключитесь к серверу и убедитесь, что соответствующие файлы удалены из папки uploads.
  • Проверьте, что метаполе uploaded_files удалено или очищено.

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

1. Файлы не удаляются

  • Проверьте правильность ключа метаполя — он должен совпадать с тем, что используется в коде.
  • Убедитесь, что пути файлов корректные и начинаются относительно wp-content/uploads.
  • Проверьте права доступа к файлам и папкам: PHP должен иметь разрешение на удаление.

2. Ошибка при вызове функции unlink()

  • Включите логирование ошибок PHP, чтобы увидеть подробности.
  • Проверьте, не заблокированы ли файлы системой безопасности сервера (SELinux, модуль безопасности Apache).

3. Метаполе uploaded_files не содержит пути

  • Убедитесь, что файлы действительно сохраняются в метаполе при загрузке и что оно не пустое.

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

  • Не храните загруженные пользователями файлы в публично доступных папках без дополнительной защиты.
  • Ограничьте типы файлов, разрешённых для загрузки, через хук upload_mimes или настройки WooCommerce.
  • Регулярно очищайте устаревшие файлы через CRON-задачи, чтобы не накапливать мусор.
  • Используйте wp_delete_file() вместо unlink() для лучшей совместимости с WordPress API.
  • Рассмотрите возможность интеграции с плагинами безопасности для мониторинга подозрительных действий с файлами.

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

МетодПлюсыМинусыПодходит для
Кастомный код в functions.phpПолный контроль, нет дополнительных плагиновТребует навыков разработки, возможные ошибкиРазработчики, кастомные решения
Плагины для управления файлами WooCommerceПростота использования, дополнительные функцииНагрузка на сайт, ограниченная гибкостьАдминистраторы без кода
CRON-задачи с удалением по расписаниюАвтоматизация, можно удалять устаревшие файлыЗадержка удаления после отмены заказаБольшие магазины с большим количеством заказов
Как автоматически удалять файлы WooCommerce после отмены заказа без плагинов
01.07.2026
Как автоматически создать миниатюры для загруженных фото в WordPress
04.01.2026
Строгий контроль остатков товаров в WooCommerce с уведомлениями
20.04.2026
Как удалить или скрыть файлы из медиабиблиотеки WordPress
27.01.2026
Как добавить автоматическое сжатие файлов при загрузке в WordPress
12.02.2026

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