随着Internet浏览器的进步,我发现自己在对网站进行编码时使用SVGS越来越舒适……尤其是对于图标和可以用png即时替换的简单图形。
看起来wordpress几乎支持SVGS。我说这几乎是因为:
默认情况下,wordpress中不是允许的文件类型。因此,您需要在上传SVG之前添加它
您在媒体库中看不到SVG缩略图。(见下图)
有时,当您将其添加到编辑器中(通过添加媒体按钮)时,编辑器并不知道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语句对svgs返回false。即使我不将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行为方面找到了答案。在这里看到它。