到目前为止,我的主题中的背景图像缩略图没有问题。然而,现在我正在尝试使用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
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">
最合适的回答,由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
您可以通过某种方式设置大小。