WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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';

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

	return $mimes;
}

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

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

Пример 2:

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

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

Включение возможности unfiltered_html у пользователя

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

По умолчанию, как ни странно, пользователи (роли), у который есть право unfiltered_html не проходят проверку current_user_can('unfiltered_html').

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

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

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

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

    Ответить1.4 года назад #
    • В примере показано же:

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

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

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

    Ответить6 мес назад #
    • Kama7528

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

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

        define('ALLOW_UNFILTERED_UPLOADS', true);

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

        Ответить6 мес назад #
        • Kama7528

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

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

          1
          Ответить6 мес назад #
          • Максим

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

            1
            Ответить6 дней назад #
  • Dalim

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

    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться