Хук wp_check_filetype_and_ext позволяет изменять MIME-тип загружаемого файла, а также корректировать его расширение и имя. Этот фильтр часто используется для корректного распознавания файлов WordPress, особенно если стандартные проверки MIME-типа не определяют его корректно.
apply_filters( ‘wp_check_filetype_and_ext’, array $wp_check_filetype_and_ext, string $file, string $filename, string[]|null $mimes, string|false $real_mime )
Функция wp_check_filetype_and_ext() в WordPress проверяет соответствие файла его MIME-типу и расширению. Хук wp_check_filetype_and_ext позволяет разработчикам изменять результаты проверки. Это полезно, например, для разрешения загрузки файлов, которые WordPress определяет неправильно, или для добавления поддержки новых типов файлов.
Параметры
- $wp_check_filetype_and_ext(array): Массив данных о файле с ключами:
ext— расширение файла.type— MIME-тип файла.proper_filename— корректное имя файла с правильным расширением.
- $file (string): Полный путь к файлу.
- $filename (string): Имя файла (может отличаться от
$file, так как путь к файлу может быть временным). - $mimes (string[]|null): Ассоциативный массив MIME-типов, где ключами являются расширения файлов, либо
null, если массив не указан. - $real_mime (string|false): Фактический MIME-тип файла, если его удалось определить, иначе
false.
Добавление поддержки загрузки CSV-файлов
WordPress по умолчанию может не всегда корректно распознавать CSV-файлы. Чтобы разрешить загрузку файлов CSV, можно использовать следующий код:
add_filter( 'wp_check_filetype_and_ext', 'allow_csv_uploads', 10, 5 );
function allow_csv_uploads( $wp_check_filetype_and_ext, $file, $filename, $mimes, $real_mime ) {
$ext = pathinfo( $filename, PATHINFO_EXTENSION );
if ( 'csv' === $ext ) {
$wp_check_filetype_and_ext['ext'] = 'csv';
$wp_check_filetype_and_ext['type'] = 'text/csv';
}
return $wp_check_filetype_and_ext;
}
Здесь мы проверяем, имеет ли файл расширение .csv, и если да, то явно указываем его MIME-тип как text/csv.
Разрешение загрузки SVG-файлов
SVG-файлы часто блокируются по умолчанию, так как могут содержать небезопасный контент. Однако, при необходимости их загрузки, можно указать правильный MIME-тип для SVG:
add_filter( 'wp_check_filetype_and_ext', 'allow_svg_uploads', 10, 5 );
function allow_svg_uploads( $wp_check_filetype_and_ext, $file, $filename, $mimes, $real_mime ) {
$ext = pathinfo( $filename, PATHINFO_EXTENSION );
if ( 'svg' === $ext ) {
$wp_check_filetype_and_ext['ext'] = 'svg';
$wp_check_filetype_and_ext['type'] = 'image/svg+xml';
}
return $wp_check_filetype_and_ext;
}
Этот код разрешает загрузку SVG, корректно задавая MIME-тип как image/svg+xml.
Изменение MIME-типа для определенного типа пользователя
Этот пример показывает, как можно разрешить загрузку текстовых файлов с расширением .log только администраторам:
add_filter( 'wp_check_filetype_and_ext', 'allow_log_files_for_admins', 10, 5 );
function allow_log_files_for_admins( $wp_check_filetype_and_ext, $file, $filename, $mimes, $real_mime ) {
$ext = pathinfo( $filename, PATHINFO_EXTENSION );
if ( 'log' === $ext && current_user_can( 'administrator' ) ) {
$wp_check_filetype_and_ext['ext'] = 'log';
$wp_check_filetype_and_ext['type'] = 'text/plain';
}
return $wp_check_filetype_and_ext;
}
В этом случае только администраторы смогут загружать .log файлы. MIME-тип устанавливается как text/plain.
Ограничение MIME-типа на основе названия файла
Предположим, вам нужно запретить загрузку файлов с именем suspicious-file.php, даже если расширение указано как .txt. Можно использовать следующий код:
add_filter( 'wp_check_filetype_and_ext', 'block_suspicious_filenames', 10, 5 );
function block_suspicious_filenames( $wp_check_filetype_and_ext, $file, $filename, $mimes, $real_mime ) {
if ( 'suspicious-file.php' === $filename ) {
$wp_check_filetype_and_ext['ext'] = false;
$wp_check_filetype_and_ext['type'] = false;
}
return $wp_check_filetype_and_ext;
}
Этот код устанавливает значения ext и type как false, чтобы WordPress не принимал файл с именем suspicious-file.php, даже если его расширение безопасно.
Проверка реального MIME-типа для корректного отображения документов
В этом примере мы проверяем реальный MIME-тип загружаемого PDF-файла и исправляем его в случае ошибки.
add_filter( 'wp_check_filetype_and_ext', 'correct_pdf_mime_type', 10, 5 );
function correct_pdf_mime_type( $wp_check_filetype_and_ext, $file, $filename, $mimes, $real_mime ) {
$ext = pathinfo( $filename, PATHINFO_EXTENSION );
if ( 'pdf' === $ext && 'application/octet-stream' === $real_mime ) {
$wp_check_filetype_and_ext['ext'] = 'pdf';
$wp_check_filetype_and_ext['type'] = 'application/pdf';
}
return $wp_check_filetype_and_ext;
}
В этом коде, если реальный MIME-тип файла определен неверно как application/octet-stream, мы исправляем его на application/pdf.
Заключение
Хук wp_check_filetype_and_ext предоставляет гибкие возможности для управления MIME-типами файлов, загружаемых в WordPress. С его помощью можно добавлять поддержку новых форматов, ограничивать загрузку определенных файлов и контролировать безопасность файлов на сайте.