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

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

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

Когда ограничение реально нужно

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

Ограничение по типу и размеру решает сразу две задачи:

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

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

Перед правкой кода полезно понять, на каком этапе возникает ошибка. В WordPress загрузка может блокироваться самим ядром, плагином безопасности, настройками сервера или фронтенд-формой.

Проверьте, где именно происходит загрузка

  • Админка — файл загружается через media-new.php или медиабиблиотеку.
  • Фронтенд — загрузка идёт через форму плагина, AJAX или кастомный обработчик.
  • WooCommerce — файл может прикрепляться к заказу, товару или отзыву через отдельный интерфейс.

Что смотреть в ошибке

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

Пошаговое решение через functions.php или мини-плагин

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

Ниже пример, который ограничивает:

  • разрешённые типы файлов;
  • максимальный размер загрузки;
  • пользовательское сообщение об ошибке.
<?php
/**
 * Plugin Name: Upload Limits for Media
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

add_filter( 'upload_mimes', function( $mimes ) {
    // Оставляем только нужные форматы.
    $allowed = array(
        'jpg|jpeg|jpe' => 'image/jpeg',
        'png'          => 'image/png',
        'gif'          => 'image/gif',
        'webp'         => 'image/webp',
    );

    return $allowed;
} );

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

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

    return $file;
} );

add_filter( 'wp_check_filetype_and_ext', function( $data, $file, $filename, $mimes ) {
    // Дополнительная проверка на случай подмены расширения.
    $check = wp_check_filetype( $filename, $mimes );

    if ( empty( $check['type'] ) ) {
        $data['ext']  = false;
        $data['type'] = false;
    }

    return $data;
}, 10, 4 );

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

Если нужно ограничить только часть пользователей

Иногда редакторам можно разрешить больше, а авторам — меньше. Тогда проверку стоит завязать на роль или capability. Например, для администраторов можно оставить полный набор, а для остальных — только JPEG, PNG и WebP.

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

    return array(
        'jpg|jpeg|jpe' => 'image/jpeg',
        'png'          => 'image/png',
        'webp'         => 'image/webp',
    );
} );

Если загрузка идёт через фронтенд-форму

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

Если формы кастомные, проверку можно делать до вызова media_handle_upload() или wp_handle_upload(). Важно не полагаться только на HTML-атрибут accept: он помогает интерфейсу, но не является защитой.

Сравнение подходов

ПодходПлюсыМинусы
Настройки плагина формыБыстро, без кодаРаботает только внутри конкретной формы
Код через фильтры WordPressГлобальное правило для сайтаНужно аккуратно тестировать роли и исключения
Ограничение только на сервереДополнительный барьер безопасностиНе даёт удобного сообщения пользователю

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

После внедрения не ограничивайтесь одной успешной загрузкой. Проверьте несколько сценариев вручную.

  • Загрузите разрешённый .jpg размером меньше лимита.
  • Попробуйте загрузить .svg или другой запрещённый формат.
  • Попробуйте загрузить файл больше установленного лимита.
  • Проверьте загрузку из админки и из фронтенд-формы, если она есть.

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

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

Ограничили MIME-типы, но файл всё равно загружается

Так бывает, если другой плагин переопределяет проверку или загрузка идёт через собственный обработчик. В этом случае ищите фильтры и валидацию в плагине формы, а также проверьте, не отключает ли кто-то стандартную проверку WordPress.

Файл не загружается, хотя формат разрешён

Причина часто в том, что сервер не принимает нужный размер через upload_max_filesize или post_max_size. WordPress не сможет принять файл, если PHP-лимит ниже вашего правила.

Запретили слишком много форматов

Если на сайте есть контент от дизайнеров или маркетологов, не спешите вырезать всё кроме JPEG и PNG. Иногда нужен WebP, а в некоторых проектах — SVG, но только после отдельной проверки и осознанного решения по безопасности.

Проверка размера только на клиенте

HTML-ограничение в поле загрузки можно обойти. Серверная проверка обязательна, иначе правило будет работать только «для честных пользователей».

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

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

Для производительности полезно не только ограничить размер загрузки, но и договориться о рабочем процессе: исходники хранятся отдельно, в медиатеку попадают уже оптимизированные изображения. Это снижает нагрузку на бэкап, ускоряет админку и уменьшает риск случайной загрузки «фото с камеры» на 12 МБ.

Если нужен более широкий набор инструментов для чистки сайта и удаления дублей, можно посмотреть в сторону Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но для самой задачи ограничения загрузки код выше обычно проще и прозрачнее.

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

Чтобы правило не сломалось через месяц, зафиксируйте его в коротком внутреннем регламенте:

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

Такой подход экономит время на разборе «почему у меня не грузится картинка» и делает поведение сайта предсказуемым для команды.

Как отключить AJAX в WooCommerce для ускорения сайта
01.06.2026
Как отключить Emoji в WordPress для улучшения производительности
27.07.2026
Как установить ограничение на регистрацию в WordPress по домену email
21.06.2026
Как удалить пустые категории в WordPress
24.03.2026
Как удалить неиспользуемые теги в WordPress с помощью кода
05.02.2026