Дозволяємо/забороняємо завантаження типів файлів
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 );