Как разрешить загрузку запрещённых типов файлов в WordPress
WordPress не позволяет загружать в медиабиблиотеку любые файлы подряд — существуют определённые ограничения. Файлы с нестандартными (запрещёнными) типами не могут быть загружены, так как WordPress использует список допустимых форматов файлов, то есть белый список MIME-типов.
Иногда такая защита мешает, и, несмотря на потенциальную опасность, нужно иметь возможность загружать файлы с запрещёнными типами.
В этой статье я покажу, как добавить новый тип файла в белый список загрузок WordPress.
Ошибка при загрузке файла с запрещённым типом
Вот как выглядит ошибка, если, например, вы попытаетесь загрузить файл с расширением .svg
:
Разрешение или запрет типов файлов для загрузки в WordPress
В WordPress есть несколько хуков, которые позволяют управлять белым списком расширений файлов:
upload_mimes
— используется в функцииget_allowed_mime_types()
.wp_check_filetype_and_ext
— используется в функцииwp_check_filetype_and_ext()
.
Ниже приведён пример кода, который демонстрирует, как разрешить загрузку нескольких типов файлов (.svg, .doc, .djvu) и как запретить (удалить из белого списка) другие (.mp4a).
add_filter( 'upload_mimes', 'upload_allow_types' );
function upload_allow_types( $mimes ) {
// разрешить новые типы
$mimes['svg'] = 'image/svg+xml';
$mimes['doc'] = 'application/msword';
$mimes['woff'] = 'font/woff';
$mimes['psd'] = 'image/vnd.adobe.photoshop';
$mimes['djv'] = 'image/vnd.djvu';
$mimes['djvu'] = 'image/vnd.djvu';
// отключить существующий тип
// unset( $mimes['mp4a'] );
return $mimes;
}
Объяснение MIME типа: image/svg+xml
— это MIME-тип для файлов формата SVG.
Аналогичным образом, вы можете разрешать или запрещать любые другие типы файлов. Список необходимых MIME-типов ��ля белого списка можно найти: список MIME-типов.
Процесс загрузки файла и проверки его типа
- Нажмите "Загрузить", выберите файл для загрузки. WordPress отправляет запрос в файл
wp-admin/async-upload.php
. - Затем WordPress проверяет MIME-тип файла по следующей цепочке:
wp-admin/async-upload.php
media_handle_upload()
wp_handle_upload()
_wp_handle_upload()
wp_check_filetype_and_ext()
wp_check_filetype()
Активация возможности загрузки любых файлов
Возможность unfiltered_html
позволяет пользователям (ролям) загружать любые файлы без проверки их типа. Но это правило по умолчанию отключено (по очевидным причинам безопасности). Давайте разберём, что это значит:
Только роли редакторов, администраторов и супер-администраторов имеют эту возможность по умолчанию. Однако независимо от этого, эти роли всегда будут возвращать false
для проверки if ( current_user_can('unfiltered_html') )
.
Чтобы эта возможность работала, вам нужно "активировать" постоянную ALLOW_UNFILTERED_UPLOADS
в файле wp-config.php
:
define( 'ALLOW_UNFILTERED_UPLOADS', true );
Теперь вы сможете загружать любые файлы без ограничений. Однако будьте осторожны и убедитесь, что загружаемые файлы безопасны.