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

Процесс загрузки файла и проверка его типа
-
Нажали "загрузить", выбрали файл загрузили, WP отправил запрос на файл wp-admin/async-upload.php.
-
Далее по следующей цепочке до проверки миме типа:
Разрешаем/запрещаем типы файлов для загрузки
Смотрите также вопрос «Загрузка ttf файлов»
Для управления белым списком расширений файлов есть два хука:
-
upload_mimes - срабатывает раньше чем wp_check_filetype_and_ext.
- wp_check_filetype_and_ext - срабатывает в конце всех базовых хуков для проверок.
Пример ниже показывает как разрешить загрузку одних типов файлов (.doc, .djvu) и как запретить другие (.mp4a) - удалить из белого списка.
add_filter( 'upload_mimes', 'upload_allow_types' ); function upload_allow_types( $mimes ) { // разрешаем новые типы $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'; //$mimes['fb2'] = 'text/xml'; //$mimes['epub'] = 'application/epub+zip'; // запрещаем (отключаем) имеющиеся // unset( $mimes['mp4a'] ); return $mimes; }
По аналогии можно разрешать или запрещать любые другие типы файлов. См. Список MIME типов.
Как загружать SVG файлы
Тип SVG файла может меняться в зависимости от файла, поэтому с ним не все так просто. Подробнее смотрите в отдельной статье.
Там же можно увидеть какие могут нестандартные ситуации могут возникнуть при разрешении загрузки запрещенных типов файлов и как их решать.
Загрузка картинок с неправильным расширением
В WP предусмотрен механизм исправления расширения файла, когда оно указано неправильно. Например, мы загружаем картинку img.png реальный формат которой JPG. В этом случае проверка на соответствие реального MIME типа файла и его расширения не проходит и WP, на основе списка подобных соответствий, пытается установить правильное расширение и пройти проверку снова (см: wp_check_filetype_and_ext()). Если проверка проходит, то название файла изменяется на правильное.
Описанный выше механизм работает давно и многие о нём даже не догадываются. Однако его нужно учитывать, когда мы добавляем новые форматы изображений для загрузки.
Например, мы добавили WEBP формат в фильтр upload_mimes, нам также нужно учесть и этот механизм проверки соответствия расширения и mime типа, иначе мы просто не сможем загрузить картинку WEBP формата, если в названии у неё указано отличное от .webp расширение.
Сделать это можно с помощью фильтра getimagesize_mimes_to_exts, подробнее про то как все это работает, читайте в описании фильтра.
# Добавляем соответствие миме-типа и расширения add_filter( 'getimagesize_mimes_to_exts', 'more_mimes_to_exts' ); function more_mimes_to_exts( $mime_to_ext ){ $mime_to_ext['image/webp'] = 'webp'; return $mime_to_ext; }
После этого хука, вы сможете загружать картинки WEBP формата, даже если в их названии указано другое расширение, например image.jpg.
Включение права unfiltered_upload
Право unfiltered_upload
позволяет пользователям (ролям) загружать любые файлы, без проверки их типа.
Это право по умолчанию есть у ролей:
- Администратор.
- Супер-администратор (в режиме мультисайт).
Однако это право по умолчанию заблокировано, т.е. указанные роли не пройдут проверку if( current_user_can('unfiltered_upload') )
, несмотря на наличие у них такого права.
Чтобы право unfiltered_upload начало работать как ожидается, нужно в файле wp-config.php «включить» константу:
define( 'ALLOW_UNFILTERED_UPLOADS', true );