С развитием интернет-браузеров я чувствую себя все более и более комфортно, используя SVGS при кодировании сайтов ... особенно для иконок и простой графики, которую можно заменить на лету pngs.
Похоже, WordPress почти поддерживает SVGS. Я говорю почти потому что:
По умолчанию это не разрешенный тип файла в WordPress. Так что вам нужно добавить это перед загрузкой SVG
Вы не можете увидеть миниатюру SVG в галерее Media. (см. изображение ниже)
Иногда, когда вы добавляете его в редактор (через кнопку добавления мультимедиа), редактор не знает размер svg, поэтому, хотя он добавляет svg как изображение, он имеет ширину и высоту ноль.
Когда вы нажимаете «изменить изображение» во всплывающем окне загрузки мультимедиа, вы получаете сообщение «изображение не существует». Смотрите изображение ниже.
Я в порядке с пунктом 1 в этом списке, но кто-нибудь выяснить, как исправить пункт 2 3 и 4?
Обновление о пункте 1:
Чтобы разрешить новый тип MIME (например, SVG), вы можете просто добавить хук в functions.php
function allow_new_mime_type($mimes) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter( 'mime_types', 'allow_new_mime_type' );
Теперь вы сможете загружать SVG. Вы можете найти дополнительную информацию в этом руководстве . Это решает только пункт 1, который, как я упоминал ранее, для меня это не проблема (хотя я думаю, что это должно быть разрешено по умолчанию).
Обновление о пункте 2:
Я немного покопался и отследил функцию, которая решает, является ли вложение изображением или нет. Кажется, что все сводится к этой функции в wp-includes / post.php
/**
* Check if the attachment is an image.
*
* @since 2.1.0
*
* @param int $post_id Attachment ID
* @return bool
*/
function wp_attachment_is_image( $post_id = 0 ) {
$post_id = (int) $post_id;
if ( !$post = get_post( $post_id ) )
return false;
if ( !$file = get_attached_file( $post->ID ) )
return false;
$ext = preg_match('/\.([^.]+)$/', $file, $matches) ? strtolower($matches[1]) : false;
$image_exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );
if ( 'image/' == substr($post->post_mime_type, 0, 6) || $ext && 'import' == $post->post_mime_type && in_array($ext, $image_exts) )
return true;
return false;
}
Как видите, в этой функции определен массив допустимых расширений изображений. Я не вижу никаких фильтров, которые могли бы быть использованы для изменения этого массива. Но это начало ...
Я не уверен, почему последний оператор if возвращает ложь для SVG, хотя. Даже если я не добавлю расширение svg в массив $ image_exts, первое условие должно вернуть true, не так ли?
if ( 'image/' == substr($post->post_mime_type, 0, 6)
Это проверяет, соответствует ли 'image /' первым шести символам в типе mime, что для svg - это image / svg + xml (первые шесть - это 'image /').
ОБНОВИТЬ
При дальнейшем исследовании кажется, что проблема вовсе не в wp_attachment_is_image, а в том, что размер изображения (ширина и высота) не добавляется в метаданные вложения при загрузке SVG. Это потому, что функция для вычисления используемого изображения - это функция php getimagesize (), которая не возвращает размер изображения для SVG. Я нашел ответ на stackoverflow о функции getimagesize и о том, как ведут себя svgs. Смотрите это здесь.