WordPress как на ладони

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

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

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

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

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

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

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

Смотрите также вопрос «Загрузка 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 );
20 комментариев
Полезные 2Вопросы 1 Все
    Войти