Разрешаем/запрещаем загрузку типов файлов
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 );