随着互联网浏览器的发展,我发现自己在编写网站代码时越来越习惯使用SVG。。。特别是图标和简单的图形,可以用PNG即时替换。
看起来wordpress几乎支持SVG。我这么说几乎是因为:
默认情况下,它不是wordpress中允许的文件类型。所以你需要在上传SVG之前添加它
在媒体库中看不到SVG缩略图。(见下图)
有时,当您将svg添加到编辑器(通过添加媒体按钮)时,编辑器不知道svg的大小,因此尽管它将svg添加为图像,但其宽度和高度为零。
当您在媒体上传弹出窗口中单击“编辑图像”时,您会收到一条消息,说“图像不存在”。请参见下图。
我对列表中的项目1很满意,但有人知道如何修复项目2、3和4吗?
Update about item 1:
要允许新的mime类型(如SVG),只需在函数中添加一个挂钩即可。php
function allow_new_mime_type($mimes) {
$mimes[\'svg\'] = \'image/svg+xml\';
return $mimes;
}
add_filter( \'mime_types\', \'allow_new_mime_type\' );
现在您应该可以上传SVG了。您可以在中找到更多信息
this tutorial. 这只解决了第1项,正如我前面提到的,这对我来说不是问题(尽管我认为默认情况下应该是允许的)。
Update about item 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;
}
正如您所看到的,在这个函数中定义了一系列有效的图像扩展。我没有看到任何可以用来修改该数组的过滤器。但这只是一个开始。。。
但我不知道为什么SVG的最后一个if语句返回false。即使我没有将svg扩展添加到数组$image\\u exts中,第一个条件也应该返回true,不是吗?
if ( \'image/\' == substr($post->post_mime_type, 0, 6)
检查“image/”是否与mime类型中的前六个字符相等,对于svg,它是image/svg+xml(前六个是“image/”)。
UPDATE
经进一步调查,问题似乎根本不在于wp\\U attachment\\U is\\u image,而是因为在上载SVG时,没有将图像大小(宽度和高度)添加到附件元数据中。这是因为用于计算所用图像的函数是php函数getimagesize(),它不会为SVG返回图像大小。我在stackoverflow上找到了关于getimagesize函数和SVG行为的答案。
See it here.