Как ограничить загрузку файлов в WordPress по типу и размеру

|

Ограничение загрузки файлов в WordPress обычно нужно не «для порядка», а чтобы закрыть конкретные дыры: пользователи загружают слишком тяжёлые изображения, пытаются отправить запрещённые форматы, а в формах появляются файлы, которые потом нельзя безопасно обработать. Если задача стоит на сайте с регистрацией, в WooCommerce-кабинете или в пользовательских формах, лучше ограничивать загрузку на уровне WordPress, а не надеяться только на фронтенд-валидацию.

Ниже разберём рабочую схему: как понять, где именно ломается загрузка, как ограничить типы и размер файлов через код, как проверить результат и какие ошибки встречаются чаще всего.

Когда ограничение не работает: что проверить сначала

Если файл «проходит» в интерфейсе, но потом не сохраняется, или наоборот — WordPress ругается на запрещённый тип, причина часто не в одном месте. Ограничение может быть задано в нескольких слоях: PHP, WordPress, плагин формы, роль пользователя, настройки хостинга.

Диагностика проблемы

Для быстрой проверки можно открыть Инструменты → Здоровье сайта и посмотреть параметры сервера, а также сделать тестовую загрузку в медиатеке и в той форме, где возникает проблема. Если файл не проходит только в форме, значит ограничение нужно ставить на уровне формы или через фильтры WordPress, а не в настройках сервера.

Как ограничить загрузку файлов через код

Самый надёжный вариант — использовать фильтр upload_mimes для разрешённых типов и отдельную проверку размера на этапе загрузки. Это работает для стандартной медиатеки и для большинства сценариев, где файл проходит через ядро WordPress.

Разрешаем только нужные расширения

Ниже пример, который оставляет изображения и PDF, а остальные типы убирает. Такой подход полезен, если на сайте нет необходимости принимать архивы, исполняемые файлы и офисные документы.

<?php
add_filter('upload_mimes', function ($mimes) {
    return [
        'jpg|jpeg|jpe' => 'image/jpeg',
        'png'          => 'image/png',
        'webp'         => 'image/webp',
        'pdf'          => 'application/pdf',
    ];
});

Если нужно не заменить список целиком, а только убрать конкретный тип, лучше работать точечно:

<?php
add_filter('upload_mimes', function ($mimes) {
    unset($mimes['exe'], $mimes['zip']);
    return $mimes;
});

Второй вариант безопаснее для сайтов, где уже используются другие допустимые форматы, например svg через отдельный плагин или webp в теме.

Ограничиваем размер файла при загрузке

WordPress сам по себе не даёт удобной глобальной настройки «не больше N мегабайт» для всех сценариев, поэтому размер обычно проверяют через фильтр wp_handle_upload_prefilter. Это удобно, если нужно показать понятную ошибку пользователю до сохранения файла.

<?php
add_filter('wp_handle_upload_prefilter', function ($file) {
    $max_size = 2 * 1024 * 1024; // 2 MB

    if (!empty($file['size']) && $file['size'] > $max_size) {
        $file['error'] = 'Файл слишком большой. Максимальный размер — 2 МБ.';
    }

    return $file;
});

Если нужно ограничить размер только для изображений, можно добавить проверку MIME-типа:

<?php
add_filter('wp_handle_upload_prefilter', function ($file) {
    $allowed_types = ['image/jpeg', 'image/png', 'image/webp'];
    $max_size = 3 * 1024 * 1024;

    if (!empty($file['type']) && in_array($file['type'], $allowed_types, true) && !empty($file['size']) && $file['size'] > $max_size) {
        $file['error'] = 'Изображение должно быть не больше 3 МБ.';
    }

    return $file;
});

Ограничиваем загрузку только для определённых ролей

Иногда администратору можно загружать всё, а автору или подписчику — только изображения и PDF. Для этого удобно проверять текущую роль и менять список разрешённых MIME-типов динамически.

<?php
add_filter('upload_mimes', function ($mimes) {
    if (current_user_can('manage_options')) {
        return $mimes;
    }

    return [
        'jpg|jpeg|jpe' => 'image/jpeg',
        'png'          => 'image/png',
        'pdf'          => 'application/pdf',
    ];
});

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

Сравнение подходов: плагин, код или настройки сервера

ПодходКогда подходитМинус
Код через upload_mimes и wp_handle_upload_prefilterНужны точные правила для WordPressНужно поддерживать код в теме или мини-плагине
Плагин для ограничения загрузокНужно быстро настроить без разработкиМожет конфликтовать с формами и другими плагинами
Настройки PHP/сервераНужно поднять общий лимит размераНе решает задачу по типам файлов

Если задача касается только WordPress, обычно лучше код. Если же файл не проходит из-за общего лимита хостинга, сначала правьте PHP-параметры, иначе WordPress просто не получит файл на проверку.

Пошаговое решение без плагина

  1. Определите, какие типы файлов реально нужны на сайте.
  2. Проверьте текущие лимиты PHP и убедитесь, что они выше желаемого максимума.
  3. Добавьте фильтр upload_mimes и оставьте только нужные MIME-типы.
  4. Добавьте wp_handle_upload_prefilter для ограничения размера.
  5. Протестируйте загрузку из медиатеки и из пользовательской формы.
  6. Проверьте, что администратор и обычный пользователь видят одинаково предсказуемое поведение.

Если код выносите в тему, не кладите его в шаблонный файл. Лучше использовать мини-плагин или mu-plugin, чтобы правило не исчезло после смены темы.

Как проверить, что ограничение сработало

Проверка должна быть не «файл вроде не грузится», а конкретной и повторяемой. Возьмите по одному файлу каждого сценария: разрешённый, запрещённый и слишком большой.

Если файл всё равно появляется в wp-content/uploads, значит ограничение сработало слишком поздно или вообще не на том уровне. В таком случае нужно смотреть, как именно форма отправляет файл: напрямую в WordPress, через AJAX или через собственный обработчик.

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

Ошибка: ограничили MIME, но файл всё равно загружается

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

Ошибка: после добавления фильтра пропали нужные типы

Это бывает, когда код возвращает новый массив MIME вместо дополнения к существующему, а в нём забыли форматы, которые уже использует сайт. Если сайт принимает, например, svg через отдельное решение, не перезаписывайте список целиком без проверки.

Ошибка: размер файла проверяется, но сообщение не видно

Некоторые формы перехватывают ошибку и показывают свой шаблон. Тогда нужно смотреть обработчик формы или её настройки уведомлений. Для стандартной медиатеки сообщение из wp_handle_upload_prefilter обычно отображается нормально.

Ошибка: на сервере лимит выше, но загрузка всё равно падает

Иногда проблема не в размере, а в правах на папку uploads, антивирусе хостинга или ограничениях Nginx/Apache. В этом случае WordPress не сможет корректно записать файл, даже если код написан правильно.

Безопасность и производительность: что не стоит игнорировать

Ограничение типов файлов — это не полноценная защита, а один из слоёв. Не стоит разрешать всё подряд только потому, что файл «нужен клиенту». Чем меньше допустимых форматов, тем меньше поверхность атаки.

Если на сайте нужен расширенный контроль за медиа, можно дополнительно использовать проверку прав доступа, аудит загрузок и очистку неиспользуемых файлов. На проектах с большим количеством контента это обычно даёт больше пользы, чем попытка решить всё одним универсальным плагином. Если нужен более широкий набор инструментов для чистки дубликатов, медиа и SEO-мусора, можно посмотреть в сторону Clearfy Pro: https://wpshop.ru/plugins/clearfy?utm_source=wporg.ru&utm_medium=article&utm_campaign=kak-ogranichit-zagruzku-fajlov-v-wordpress-po-tipu-i-razmeru

Для производительности важно не только ограничивать типы, но и не разрешать слишком большие изображения без необходимости. Иначе пользователи будут загружать тяжёлые файлы, а потом вы получите лишнюю нагрузку на генерацию размеров и на дисковое пространство.

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

Как автоматически отключить неиспользуемые плагины в WordPress
20.06.2026
Как использовать WP-Cron для удаления неактивных пользователей в WordPress
30.07.2026
Автоматизация удаления старых записей через AJAX в WordPress
17.01.2026
Как установить ограничение на число сообщений в формах WordPress
21.01.2026
Как запретить XML-RPC запросы в WordPress без поломки мобильных приложений
19.08.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее