Разрешение загрузки WebP изображений
Я попробовал оба этих варианта, но всё равно получаю сообщение об ошибке: "Извините, этот тип файла не разрешён по соображениям безопасности."
// добавляем поддержку MIME-типов для WebP
function webp_upload_mimes( $existing_mimes ) {
// добавляем WebP в список разрешённых MIME-типов
$existing_mimes['webp'] = 'image/webp';
// возвращаем массив обратно в функцию с добавленным MIME-типом
return $existing_mimes;
}
add_filter( 'mime_types', 'webp_upload_mimes' );
function my_custom_upload_mimes($mimes = array()) {
// добавляем WebP в список разрешённых MIME-типов
$existing_mimes['webp'] = 'image/webp';
return $mimes;
}
add_action('upload_mimes', 'my_custom_upload_mimes');
Есть идеи?

Необходимо использовать фильтр wp_check_filetype_and_ext
, чтобы установить MIME-тип и расширение для файлов webp, в дополнение к использованию фильтра upload_mimes
для добавления MIME-типа в список разрешенных для загрузки.
/**
* Устанавливает расширение и MIME-тип для файлов .webp.
*
* @param array $wp_check_filetype_and_ext Массив данных файла, содержащий ключи 'ext', 'type' и
* 'proper_filename'.
* @param string $file Полный путь к файлу.
* @param string $filename Имя файла (может отличаться от $file, так как
* $file находится во временной директории).
* @param array $mimes Ключ — расширение файла, значение — MIME-тип.
*/
add_filter( 'wp_check_filetype_and_ext', 'wpse_file_and_ext_webp', 10, 4 );
function wpse_file_and_ext_webp( $types, $file, $filename, $mimes ) {
if ( false !== strpos( $filename, '.webp' ) ) {
$types['ext'] = 'webp';
$types['type'] = 'image/webp';
}
return $types;
}
/**
* Добавляет тип файла webp в список разрешенных MIME-типов
*
* @see https://codex.wordpress.org/Plugin_API/Filter_Reference/upload_mimes
*
* @param array $mimes MIME-типы, где ключ — регулярное выражение для расширения файла,
* соответствующего этим типам. 'swf' и 'exe' удалены из полного списка.
* 'htm|html' также удаляются в зависимости от возможностей пользователя.
*
* @return array
*/
add_filter( 'upload_mimes', 'wpse_mime_types_webp' );
function wpse_mime_types_webp( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
Я проверил этот код на WordPress версии 5.0.1 и смог загружать файлы webp после его добавления.

Так странно. Функция upload_mimes у меня уже была и работала нормально, а потом в один день, без видимых причин, перестала работать. Я обнаружил это, добавил ваш код (у меня проблема была с .svg
), и вуаля — идеально! В любом случае, спасибо.

К сожалению, у меня не работает. До сих пор получаю сообщение "This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading." Использую WP 5.8.

@WilliamBeaumont Я думаю, что упомянутая вами проблема отличается от проблемы автора. Этот комментарий (и ветка обсуждения) может помочь решить ошибку, которую вы отметили: https://wordpress.org/support/topic/wordpress-5-8-still-rejects-webp-images/#post-14733877

Иногда загрузки ограничены вашим хостингом. Попробуйте определить константу ALLOW_UNFILTERED_UPLOADS
, которая разрешает загрузку файлов любого типа:
define( 'ALLOW_UNFILTERED_UPLOADS', true );
Используйте это в файле wp-config.php
на время тестирования. Затем попробуйте загрузить файл снова, и если это не сработает, вероятно, хостинг заблокировал загрузку файлов этого типа. Убедитесь, что вы удалили константу сразу после завершения тестирования.
Дополнительно, вы можете использовать функцию get_allowed_mime_types()
для проверки разрешенных MIME-типов загружаемых файлов.

Мне удалось заставить это работать, создав следующий плагин. (Вам просто нужно добавить этот код в новый файл в директории /wp-content/plugins/
, чтобы создать плагин. Убедитесь, что вы активировали плагин после его создания.)
<?php
/**
* Название плагина: WPSE Разрешить загрузку Webp
*/
function webp_file_and_ext( $mime, $file, $filename, $mimes ) {
$wp_filetype = wp_check_filetype( $filename, $mimes );
if ( in_array( $wp_filetype['ext'], [ 'webp' ] ) ) {
$mime['ext'] = true;
$mime['type'] = true;
}
return $mime;
}
add_filter( 'wp_check_filetype_and_ext', 'webp_file_and_ext', 10, 4 );
function add_webp_mime_type( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
add_filter( 'upload_mimes', 'add_webp_mime_type' );

Я привел пример того, как это может выглядеть в классе:
<?php
class Example {
public array $mime_types = [
'woff' => 'font/woff|application/font-woff|application/x-font-woff|application/x-woff|application/octet-stream',
'woff2' => 'font/woff2|application/font-woff2|application/x-font-woff2|application/x-woff2|application/octet-stream',
'ttf' => 'font/ttf|application/font-ttf|application/x-font-ttf|application/x-ttf|application/octet-stream',
'otf' => 'font/otf|application/font-otf|application/x-font-otf|application/x-otf|application/octet-stream',
'eot' => 'application/vnd.ms-fontobject'
];
private function __construct() {
/** ваши другие actions + filters */
add_filter( 'upload_mimes', [ $this, 'custom_upload_mimes' ] );
add_filter( 'wp_check_filetype_and_ext', [ $this, 'file_and_ext_webp' ], 10, 4 );
}
/**
* @param $existing_mimes array
*
* @return array
*/
function custom_upload_mimes( $existing_mimes = [] ): array {
foreach ( $this->mime_types as $ext => $value ) {
$existing_mimes[ $ext ] = $value;
}
return $existing_mimes;
}
/**
* Устанавливает расширение и MIME-тип для предопределенных файлов.
*
* @return mixed
*/
function file_and_ext_webp( $types, $file, $filename, $mimes ) {
foreach ( $this->mime_types as $ext => $value ) {
if ( false !== strpos( $filename, ".$ext" ) ) {
$types['ext'] = $ext;
$types['type'] = $value;
}
}
return $types;
}
}
https://gist.github.com/frizzant/7ad08ad6bfc0dbac08dabeed73e2d964
