WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru WPmentor - Ищем топовых специалистов по WordPress, чтобы помочь вам заработать

Разрешаем загрузку запрещенных типов файлов

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

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

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

Вот так выглядит ошибка, если, например, попытаться загрузить файл в расширением .svg:

Разрешаем/запрещаем типы файлов для загрузки

Для управления белым списком расширений файлов есть несколько хуков:

Пример 1:

Пример ниже показывает как разрешить загрузку одних типов файлов (.svg, .doc, .djvu) и как запретить другие (.mp4a) - удалить из белого списка.

add_filter( 'upload_mimes', 'upload_allow_types' );
function upload_allow_types( $mimes ) {
	// разрешаем новые типы
	$mimes['svg']  = 'text/plain'; // image/svg+xml
	$mimes['doc']  = 'application/msword'; 
	$mimes['woff'] = 'font/woff';
	$mimes['psd']  = 'image/vnd.adobe.photoshop'; 
	$mimes['djv']  = 'image/vnd.djvu';
	$mimes['djvu'] = 'image/vnd.djvu';
	$mimes['webp'] = 'image/webp';

	// отключаем имеющиеся
	unset( $mimes['mp4a'] );

	return $mimes;
}

image/svg+xml - это MIME тип svg файла.

По аналогии можно разрешать или запрещать любые другие типы файлов. Список MIME типов для белого списка смотрите здесь.

Пример 2:

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

Процесс загрузки файла и проверка его типа

Включение права unfiltered_html

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

Право unfiltered_html по умолчанию есть у ролей: редактор, админ, супер-админ. Но при этом, эти роли не пройдут проверку if( current_user_can('unfiltered_html') ).

Чтобы право unfiltered_html начало работать как ожидается, нужно в файле wp-config.php «включить» константу:

define( 'ALLOW_UNFILTERED_UPLOADS', true );
9 комментов
  • Liza

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

    А может есть плагин медиазагрузчика который на для пользователей отдельно, честно скажу, искала везде не могу найти такой плагин для сайта

    Ответить13.Фев.2018 в 15:12 #
    • В примере показано же:

      unset( $mimes['mp4a'] ); // отключаем mp4a

      Пишем это в той самой функции

      1
      Ответить23.Июн.2018 в 13:31 #
  • Мне кажется что-то изменилось с приходом гуттенберга. Код не срабаывает.

    1
    Ответить19.Дек.2018 в 07:45 #
    • Kama7680

      MIME Тип файла правильно укажи (они разные бывают). Код рабочий!

      1
      Ответить19.Дек.2018 в 20:15 #
      • Мне нужно было разрешить к загрузке SVG, поэтому сделал копи-паст вашего образца - не сработало. Поэтому дал временное разрешение:

        define('ALLOW_UNFILTERED_UPLOADS', true);

        Возможно, я должен был заменить "text/plain" на "image/svg+xml" в строке $mimes['svg'] = 'text/plain'; // image/svg+xml, но тогда зачем в образце именно так указано?

        Ответить20.Дек.2018 в 07:31 #
        • Kama7680

          Для CVG раньше работал image/svg+xml, теперь работает text/plain. Вообще, миме тип svg image/svg+xml. Смотри также wp_check_filetype_and_ext.

          ALLOW_UNFILTERED_UPLOADS = true - это опасно!

          2
          Ответить20.Дек.2018 в 12:23 #
          • Максим

            Столкнулся с подобной проблемой. Как оказалось причина может быть и в самом файле svg. Пересохранил свои svg-изображения через сервис https://jakearchibald.github.io/svgomg/ и все загрузилось. Может кому будет полезно smile

            2
            Ответить10.Июл.2019 в 16:24 #
  • Dalim

    Проделал всё как указано в статье, не помогло. В чем может быть причина? Инфа ещё актуальНа? мб код уже не рабочий...

    1
    Ответить18.Май.2019 в 02:20 #
  • РЕСПЕКТ АВТОРУ ЗА ТРУД

    1
    Ответить14.Дек.2019 в 21:25 #