Com o avanço dos navegadores de internet, eu me encontro cada vez mais à vontade usando SVGS ao codificar sites ... especialmente para ícones e gráficos simples que podem ser substituídos rapidamente por pngs.
Parece que o wordpress quase suporta SVGS. Eu digo quase porque:
-
Não é por padrão um tipo de arquivo permitido no wordpress. Então você precisa adicionar isso antes de fazer upload de SVGs
-
Você não pode ver uma miniatura SVG na galeria Mídia. (veja a imagem abaixo)
-
Às vezes, quando você o adiciona ao editor (via botão adicionar mídia), o editor não sabe o tamanho do svg, portanto, embora adicione o svg como uma imagem, ele tem largura e altura de zero.
-
Quando você clica em "editar imagem" de dentro do pop-up de upload da mídia, recebe uma mensagem dizendo "a imagem não existe". Veja a imagem abaixo.
Estou bem com o item 1 desta lista, mas alguém descobriu como um item de correção 2 3 e 4?
Atualize sobre o item 1:
Para permitir um novo tipo de mime (como SVG), basta adicionar um gancho em functions.php
function allow_new_mime_type($mimes) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter( 'mime_types', 'allow_new_mime_type' );
Agora você deve poder fazer upload de SVGs. Você pode encontrar mais informações em este tutorial . Isso só resolve o item 1, que, como mencionei antes, não é um problema para mim (embora eu ache que deveria ser permitido por padrão).
Atualize sobre o item 2:
Eu fiz algumas pesquisas e localizei a função que decide se um anexo é uma imagem ou não. Parece que tudo se resume a essa função em 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;
}
Como você pode ver, há uma série de extensões de imagem válidas definidas nesta função. Não vejo nenhum filtro que possa ser usado para modificar esse array. Mas isso é um começo ...
Não sei porque a última declaração if retorna false para svgs. Mesmo se eu não adicionar a extensão svg à array $ image_exts, a primeira condição deve retornar true, não deveria?
if ( 'image/' == substr($post->post_mime_type, 0, 6)
Isso verifica se 'image /' é enqual para o primeiro seis caractere no tipo mime, que para svg é image / svg + xml (o primeiro seis é "image /").
UPDATE
Após investigação adicional, parece que o problema não é com wp_attachment_is_image, mas porque o tamanho da imagem (largura e altura) não está sendo adicionado aos metadados do anexo quando o SVG é carregado. Isso porque a função para calcular a imagem usada é a função php getimagesize (), que não retorna um tamanho de imagem para o SVG. Eu encontrei uma resposta no stackoverflow sobre a função getimagesize e sobre como os svgs se comportam. Veja aqui.