Ограничение загрузки файлов в WordPress обычно нужно не «для порядка», а чтобы закрыть конкретные дыры: пользователи загружают слишком тяжёлые изображения, пытаются отправить запрещённые форматы, а в формах появляются файлы, которые потом нельзя безопасно обработать. Если задача стоит на сайте с регистрацией, в WooCommerce-кабинете или в пользовательских формах, лучше ограничивать загрузку на уровне WordPress, а не надеяться только на фронтенд-валидацию.
Ниже разберём рабочую схему: как понять, где именно ломается загрузка, как ограничить типы и размер файлов через код, как проверить результат и какие ошибки встречаются чаще всего.
Когда ограничение не работает: что проверить сначала
Если файл «проходит» в интерфейсе, но потом не сохраняется, или наоборот — WordPress ругается на запрещённый тип, причина часто не в одном месте. Ограничение может быть задано в нескольких слоях: PHP, WordPress, плагин формы, роль пользователя, настройки хостинга.
Диагностика проблемы
- Проверьте, не упирается ли загрузка в лимиты PHP:
upload_max_filesize,post_max_size,max_execution_time. - Посмотрите, не режет ли файл плагин формы до передачи в WordPress.
- Убедитесь, что пользователь действительно загружает файл через стандартный медиазагрузчик или через
wp_handle_upload(). - Если нужно ограничить только часть сайта, проверьте, не конфликтует ли правило с ролью пользователя или типом записи.
Для быстрой проверки можно открыть Инструменты → Здоровье сайта и посмотреть параметры сервера, а также сделать тестовую загрузку в медиатеке и в той форме, где возникает проблема. Если файл не проходит только в форме, значит ограничение нужно ставить на уровне формы или через фильтры 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 просто не получит файл на проверку.
Пошаговое решение без плагина
- Определите, какие типы файлов реально нужны на сайте.
- Проверьте текущие лимиты PHP и убедитесь, что они выше желаемого максимума.
- Добавьте фильтр
upload_mimesи оставьте только нужные MIME-типы. - Добавьте
wp_handle_upload_prefilterдля ограничения размера. - Протестируйте загрузку из медиатеки и из пользовательской формы.
- Проверьте, что администратор и обычный пользователь видят одинаково предсказуемое поведение.
Если код выносите в тему, не кладите его в шаблонный файл. Лучше использовать мини-плагин или mu-plugin, чтобы правило не исчезло после смены темы.
Как проверить, что ограничение сработало
Проверка должна быть не «файл вроде не грузится», а конкретной и повторяемой. Возьмите по одному файлу каждого сценария: разрешённый, запрещённый и слишком большой.
- Загрузите
.jpgили.pngи убедитесь, что файл проходит. - Попробуйте загрузить запрещённый тип, например
.exeили.zip, и проверьте, что WordPress блокирует его до сохранения. - Попробуйте файл больше лимита и убедитесь, что сообщение об ошибке читаемое, а не общее «Ошибка HTTP».
- Проверьте загрузку под ролью без прав администратора.
- Посмотрите, не появился ли файл в медиатеке после неудачной попытки.
Если файл всё равно появляется в 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 один и тот же файл может проходить через разные обработчики, и это нормально, пока вы проверяете каждый сценарий отдельно.