Как загрузить SVG в WordPress 4.9.8?
Я пытался загрузить SVG после установки различных плагинов. Также добавил фильтр в файл functions.php.
function add_svg_to_upload_mimes( $upload_mimes ) {
$upload_mimes['svg'] = 'image/svg+xml';
$upload_mimes['svgz'] = 'image/svg+xml';
return $upload_mimes;
}
add_filter( 'upload_mimes', 'add_svg_to_upload_mimes', 10, 1 );
Но при загрузке SVG всё равно появляется следующая ошибка.
@rana-umer ваш код правильный, просто удалите "+xml" после 'image/svg'.
//добавляем SVG в разрешенные типы файлов для загрузки
function add_file_types_to_uploads($file_types){
$new_filetypes = array();
$new_filetypes['svg'] = 'image/svg';
$file_types = array_merge($file_types, $new_filetypes );
return $file_types;
}
add_action('upload_mimes', 'add_file_types_to_uploads');

Этот вопрос заставил меня задуматься. Да, почему WordPress не поддерживает это изначально? И тогда я узнал ответ.
Вы спросили, как загрузить SVG в WordPress 4.9.8 (актуальная версия на момент написания). Вы упомянули, что «пытались загрузить после установки различных плагинов». Вы не указали, какие именно плагины и связаны ли они с SVG.
Насколько я понимаю ситуацию, самое безопасное и подходящее решение на данный момент — использовать плагин SVF Safe (разработанный специально для этой цели) от Darrell Doyle. Если этот плагин не работает у вас, значит, у вас конфликт с чем-то другим, и вам следует применить стандартные методы для его устранения. Лично я бы отказался от идеи загрузки SVG, если этот плагин не сработал.
Если вы еще не читали, рекомендую ознакомиться со статьями «SVG Uploads in WordPress — неудобная правда» от Bjorn Johansen и/или «Как безопасно включить поддержку SVG в WordPress — 2 простых шага» от Brian Jackson. По крайней мере, вы будете знать, во что ввязываетесь.

Я попробовал загрузить SVG-файл с помощью предложенного плагина. Все сработало, как и ожидалось. И миниатюра тоже отображается. Большое спасибо за рекомендацию. @Tedinoz

На самом деле, здесь есть нюансы помимо этого ответа - SVG должен быть правильно отформатирован, иначе он просто не загрузится, независимо от того, какой код или плагин вы используете: https://kinsta.com/blog/wordpress-svg/#attachment_10218
Только сейчас увидел, что Даррелл Дойл написал санітайзер для SVG, так что, думаю, он интегрирован в его плагин. Но для тех, кто хочет обойтись без плагина, важно понимать процесс санитизации и требования к нему.

//добавляем SVG в разрешенные типы файлов для загрузки
function add_file_types_to_uploads($file_types){
$new_filetypes = array();
$new_filetypes['svg'] = 'image/svg+xml';
$file_types = array_merge($file_types, $new_filetypes );
return $file_types;
}
add_action('upload_mimes', 'add_file_types_to_uploads');

Первая функция проверяет версию WordPress и добавляет поддержку для версий ниже 4.8. Вторая функция регистрирует MIME-тип файла (SVG), а последняя исправляет отображение миниатюр в медиатеке.
/**
* Добавляет поддержку SVG
*
*/
add_filter( 'wp_check_filetype_and_ext', function( $data, $file, $filename, $mimes) {
global $wp_version;
if( $wp_version == '4.7' || ( (float) $wp_version < 4.7 ) ) {
return $data;
}
$filetype = wp_check_filetype( $filename, $mimes );
return [
'ext' => $filetype['ext'],
'type' => $filetype['type'],
'proper_filename' => $data['proper_filename']
];
}, 10, 4 );
function ns_mime_types( $mimes ){
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter( 'upload_mimes', 'ns_mime_types' );
function ns_fix_svg() {
echo '<style type="text/css">.thumbnail img { width: 100% !important; height: auto !important;} </style>';
}
add_action( 'admin_head', 'ns_fix_svg' );

Добавьте эти хуки, я тестировал на WP 5.3, они работают:
// Разрешить SVG
add_filter('wp_check_filetype_and_ext', function ($data, $file, $filename, $mimes) {
if (!$data['type']) {
$wp_filetype = wp_check_filetype($filename, $mimes);
$ext = $wp_filetype['ext'];
$type = $wp_filetype['type'];
$proper_filename = $filename;
if ($type && 0 === strpos($type, 'image/') && $ext !== 'svg') {
$ext = $type = false;
}
$data['ext'] = $ext;
$data['type'] = $type;
$data['proper_filename'] = $proper_filename;
}
return $data;
}, 10, 4);
add_filter('upload_mimes', function ($mimes) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
});
add_action('admin_head', function () {
echo '<style type="text/css">
.media-icon img[src$=".svg"], img[src$=".svg"].attachment-post-thumbnail {
width: 100% !important;
height: auto !important;
}</style>';
});
