无法提取和设置SVG尺寸

时间:2017-02-05 作者:CoderScissorhands

到目前为止,我的主题中的背景图像缩略图没有问题。然而,现在我正在尝试使用SVG作为特色图像,有些东西正在被打破。问题似乎与SVG的宽度有关,SVG的宽度在wp_get_attachment_image_src(). 因此,我要做的是找出如何从SVG中提取宽度和高度信息,然后在SVG数据库字段中将其设置为适当的值,这并不容易。

注意:上传或渲染SVG没有一般问题,它们在我的徽标中显示良好

错误和代码:零宽度的证据这是Wordpress在页面上抛出的错误:Warning: Division by zero in /wp-content/themes/tesseract/functions.php on line 771

这是函数中的代码。错误之前的php(第771行)。

    /*759*/ function tesseract_output_featimg_blog() {
    /*760*/
    /*761*/ global $post;
    /*762*/
    /*763*/ $thumbnail = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), \'full\' );
    /*764*/ $featImg_display = get_theme_mod(\'tesseract_blog_display_featimg\');
    /*765*/ $featImg_pos = get_theme_mod(\'tesseract_blog_featimg_pos\');
    /*766*/
    /*767*/ $w = $thumbnail[1]; /* supposed to return thumbnail width */
    /*768*/ $h = $thumbnail[2];  /* supposed to return thumbnail height */
    /*769*/ $bw = 720;
    /*770*/ $wr = $w/$bw;  
    /*771*/ $hr = $h/$wr; /**** this is the line that throws the error ****/
你可以看到有一个部门$wr 作为分母。看来$wr 由于其唯一的非常量因子,$w, 也为零(另一个因素是720,所以不能怪它)。$w\'s值由$thumbnail[1]. $thumbnail[1]\'s值在第763行设置,代码如下:

$thumbnail = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), \'full\' );

根据the Codex, 函数返回数组中的第二个值wp_get_attachment_image_src(即。$thumbnail[1]) 确实是缩略图的宽度。该值似乎为零,因为它与$w, 这确实是第771行的分母:(

重要提示:“我的主题”将缩略图实现为背景图像

我使用的父主题“Tesseract”,将特征图像放置为锚定的背景图像/<a> 元素,而不是将其作为<img> 元素。I do not believe this is the cause of the problem, but when offering solutions, they should be compatible with background-images, not <img> objects.

无法调整修复程序#1:

我确实找到了this webpage 它修复了将SVG用作特征图像的问题。这表明该问题与宽度的计算有关。但是,我无法应用该修复,因为它是针对img 将SVG作为src, 我有一个<a> 将SVG位置设置为background-image-url.

这就是解决方案

function custom_admin_head() {
  $css = \'\';
  $css = \'td.media-icon img[src$=".svg"] { width: 100% !important; height: auto !important; }\';
  echo \'<style type="text/css">\'.$css.\'</style>\';
}
add_action(\'admin_head\', \'custom_admin_head\');
修复#2(通过CSS的最小宽度)不起作用基于我从上一页得到的想法,即宽度可能是问题所在,我尝试使用CSS将最小宽度设置为50%<a>. 代码如下:

a.entry-post-thumbnail.above {
    min-width: 50% !important;
} 
我的开发工具显示CSS“使用”,最小宽度确实设置为50%。仍然WP抛出了与图像未显示相同的错误。可能CSS没有在函数之前设置它。php运行wp\\u get\\u attachment\\u image\\u src,所以这无关紧要?

有人知道如何绕过这个零计算吗?我真的很想让它与背景图像一起工作,而不必覆盖太多的父主题。

修复#3(挂接筛选器)无效wp_get_attachment_image_src(). 代码不会产生错误,但不会删除除法错误或显示SVG。这是我放入函数中的片段。php。也许优先顺序是错误的

add_filter( \'wp_get_attachment_image_src\', \'fix_wp_get_attachment_image_svg\', 10, 4 );  /* the hook */

     function fix_wp_get_attachment_image_svg($image, $attachment_id, $size, $icon) {
        if (is_array($image) && preg_match(\'/\\.svg$/i\', $image[0]) && $image[1] == 1) {
            if(is_array($size)) {
                $image[1] = $size[0];
                $image[2] = $size[1];
            } elseif(($xml = simplexml_load_file($image[0])) !== false) {
                $attr = $xml->attributes();
                $viewbox = explode(\' \', $attr->viewBox);
                $image[1] = isset($attr->width) && preg_match(\'/\\d+/\', $attr->width, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[2] : null);
                $image[2] = isset($attr->height) && preg_match(\'/\\d+/\', $attr->height, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[3] : null);
            } else {
                $image[1] = $image[2] = null;
            }
        }
        return $image;
    } 
底线是:

我认为我需要弄清楚如何从SVG文件本身提取宽度信息,并在运行之前将其添加到WP数据库中。php在第771行运行计算。如果你知道怎么做,我们将非常感谢你的指导。

Some potentially helpful Resources

  • This question 似乎有一些有用的信息,@Josh there提供的代码片段让我最终可以在Medeia library中查看我的SVG,但特色图片仍然不完整
  • This question 似乎有一些基于XML的解决方案,但我不知道如何使其适应WPThis filter 这似乎是相关的

SVG文件的标题

这是SVG标题:

<?xml version="1.0" encoding="utf-8"?> <!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="475.419px" height="406.005px" viewBox="0 0 475.419 406.005" enable-background="new 0 0 475.419 406.005" xml:space="preserve">

2 个回复
最合适的回答,由SO网友:CoderScissorhands 整理而成

我解决了!!!由于第三种情况,修复程序#3(以上)中的筛选器无法工作if 触发维度提取和附着的语句:

if (is_array($image) && preg_match(\'/\\.svg$/i\', $image[0]) && $image[1] == 1)

$image[1] 第三种情况是报告的SVG文件宽度,WP在它进入过滤器之前看到它。因为我知道它的值,宽度是0(来自上面描述的“零除法误差”),我怀疑这个值需要更改以匹配它。我改变了决赛1 在那上面if a的条件0 和瞧!除法错误消失了,图像正在显示,非常漂亮,所以我可能会广告!

我之所以能够发现这一点,是因为在许多论坛上,人们抱怨SVG错误地获得了1px的宽度。在某些版本的WP中可能是这样,但在我的WP 4.7.2媒体库中,SVG没有维度,甚至1px 作为维度过帐。相反,在我的例子中,根本没有关于维度的元数据。

我认为,如果宽度为1或0,则该过滤器的灵活版本可以应用于有1px问题的人和像我这样宽度为0的人。下面我使用$image[1] <= 1作为if 语句而不是$image[1] == 1 但我想你也可以用这个:( ($image[1] == 0) || ($image[1] == 1) )

工作过滤器

 add_filter( \'wp_get_attachment_image_src\', \'fix_wp_get_attachment_image_svg\', 10, 4 );  /* the hook */

 function fix_wp_get_attachment_image_svg($image, $attachment_id, $size, $icon) {
    if (is_array($image) && preg_match(\'/\\.svg$/i\', $image[0]) && $image[1] <= 1) {
        if(is_array($size)) {
            $image[1] = $size[0];
            $image[2] = $size[1];
        } elseif(($xml = simplexml_load_file($image[0])) !== false) {
            $attr = $xml->attributes();
            $viewbox = explode(\' \', $attr->viewBox);
            $image[1] = isset($attr->width) && preg_match(\'/\\d+/\', $attr->width, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[2] : null);
            $image[2] = isset($attr->height) && preg_match(\'/\\d+/\', $attr->height, $value) ? (int) $value[0] : (count($viewbox) == 4 ? (int) $viewbox[3] : null);
        } else {
            $image[1] = $image[2] = null;
        }
    }
    return $image;
} 
谢谢大家的帮助,这真是团队的努力!

SO网友:prosti

很难猜测像我这样的WordPress爱好者到底有什么问题,但既然你在循环中ping了我。。。

我只想说你还没有共享主题文件。。。

File: wp-includes/media.php
804: /**
805:  * Retrieve an image to represent an attachment.
806:  *
807:  * A mime icon for files, thumbnail or intermediate size for images.
808:  *
809:  * The returned array contains four values: the URL of the attachment image src,
810:  * the width of the image file, the height of the image file, and a boolean
811:  * representing whether the returned array describes an intermediate (generated)
812:  * image size or the original, full-sized upload.
813:  *
814:  * @since 2.5.0
815:  *
816:  * @param int          $attachment_id Image attachment ID.
817:  * @param string|array $size          Optional. Image size. Accepts any valid image size, or an array of width
818:  *                                    and height values in pixels (in that order). Default \'thumbnail\'.
819:  * @param bool         $icon          Optional. Whether the image should be treated as an icon. Default false.
820:  * @return false|array Returns an array (url, width, height, is_intermediate), or false, if no image is available.
821:  */
822: function wp_get_attachment_image_src( $attachment_id, $size = \'thumbnail\', $icon = false ) {
823:    // get a thumbnail or intermediate image if there is one
824:    $image = image_downsize( $attachment_id, $size );
825:    if ( ! $image ) {
826:        $src = false;
827: 
828:        if ( $icon && $src = wp_mime_type_icon( $attachment_id ) ) {
829:            /** This filter is documented in wp-includes/post.php */
830:            $icon_dir = apply_filters( \'icon_dir\', ABSPATH . WPINC . \'/images/media\' );
831: 
832:            $src_file = $icon_dir . \'/\' . wp_basename( $src );
833:            @list( $width, $height ) = getimagesize( $src_file );
834:        }
835: 
836:        if ( $src && $width && $height ) {
837:            $image = array( $src, $width, $height );
838:        }
839:    }
本部分包括:

@list( $width, $height ) = getimagesize( $src_file );
看起来是SVG图像之后的问题don\'t have the size info. 它们正好适合这个容器。

因此,您可以创建自己的版本wp_get_attachment_image_src 您可以通过某种方式设置大小。

相关推荐

微型MCE编辑器从SVG USE标记中剥离xlink:href参数

我有一个内嵌SVG标记,带有嵌入的<;使用(>);标签HTML:<ul> <li><svg class=\"icon-user\"><use xlink:href=\"#icon-user\"></use></svg> My Account</li> </ul> 我创建了一个过滤器函数来强制微型MCE编辑器不使用SVG标记。代码改编自post:use of <svg