You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce中img标签无法显示Base64图片的问题解决

解决WooCommerce产品元数据中Base64图片无法显示的问题

我在子主题中重写了wc_display_item_meta函数,用于在产品下方以列表形式展示产品元数据,但遇到了Base64图片无法正常显示的问题。

初始代码及问题分析

初始代码尝试处理名为「Tie Preview」的元数据,提取Base64内容并展示图片,但图片无法加载:

function wc_display_item_meta( $item, $args = array() ) {
    $strings = array();
    $html    = '';
    $args    = wp_parse_args(
        $args,
        array(
            'before'       => '<ul class="wc-item-meta"><li>',
            'after'        => '</li></ul>',
            'separator'    => '</li><li>',
            'echo'         => true,
            'autop'        => false,
            'label_before' => '<strong class="wc-item-meta-label">',
            'label_after'  => ':</strong> ',
        )
    );

    foreach ( $item->get_all_formatted_meta_data() as $meta_id => $meta ) {
        $value     = $args['autop'] ? wp_kses_post( $meta->display_value ) : wp_kses_post( make_clickable( trim( $meta->display_value ) ) );
        $key = wp_kses_post( $meta->display_key );
        if($key === "Tie Preview"){
            
            $b64 = explode(',', $value);
            $image = base64_decode($b64[1]);
            $strings[] = $args['label_before'] . wp_kses_post( $meta->display_key ) . $args['label_after'] . '<img src="data:image/png;base64,' . $image . '" />';
        }else{
            $strings[] = $args['label_before'] . wp_kses_post( $meta->display_key ) . $args['label_after'] . $value;    
        }

    }

    if ( $strings ) {
        $html = $args['before'] . implode( $args['separator'], $strings ) . $args['after'];
    }

    $html = apply_filters( 'woocommerce_display_item_meta', $html, $item, $args );

    if ( $args['echo'] ) {
        // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
        echo $html;
    } else {
        return $html;
    }
}

问题出在两点:

  • 错误调用了base64_decode():img标签的src需要的是原始的Base64编码字符串,而不是解码后的二进制数据,这直接导致图片资源无效。
  • 元数据值被自动添加了<p>标签:替换为a标签测试时发现,Base64字符串前后被包裹了<p>标签,进一步破坏了URL的有效性。

修改后的解决方案

针对上述问题,调整代码如下:去掉不必要的base64解码操作,用substr()移除首尾的<p>标签,直接使用清理后的Base64字符串作为图片源和链接地址:

function wc_display_item_meta( $item, $args = array() ) {
    $strings = array();
    $html    = '';
    $args    = wp_parse_args(
        $args,
        array(
            'before'       => '<ul class="wc-item-meta"><li>',
            'after'        => '</li></ul>',
            'separator'    => '</li><li>',
            'echo'         => true,
            'autop'        => false,
            'label_before' => '<strong class="wc-item-meta-label">',
            'label_after'  => ':</strong> ',
        )
    );

    foreach ( $item->get_all_formatted_meta_data() as $meta_id => $meta ) {
        $value     = $args['autop'] ? wp_kses_post( $meta->display_value ) : wp_kses_post( make_clickable( trim( $meta->display_value ) ) );
        $key = wp_kses_post( $meta->display_key );
        if($key === "Tie Preview"){
            $sub1 = substr($value, 3);
            $sub2 = substr($sub1, 0, -4);
            $strings[] = $args['label_before'] . wp_kses_post( $meta->display_key ) . $args['label_after'] . '<img src="' . $sub2 . '" />' . "<a href='" . $sub2 . "' >click here</a>";
        }else{
            $strings[] = $args['label_before'] . wp_kses_post( $meta->display_key ) . $args['label_after'] . $value;    
        }

    }

    if ( $strings ) {
        $html = $args['before'] . implode( $args['separator'], $strings ) . $args['after'];
    }

    $html = apply_filters( 'woocommerce_display_item_meta', $html, $item, $args );

    if ( $args['echo'] ) {
        // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
        echo $html;
    } else {
        return $html;
    }
}

修改后,img标签能正确加载Base64图片,同时保留了点击查看原图的链接功能。

内容的提问来源于stack exchange,提问作者Andrew Mason

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:10:35