Дозволяємо/забороняємо завантаження типів файлів

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

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *