WordPress中wc_display_item_meta自动生成p标签无法移除/替换问题咨询
解决方案
wc_display_item_meta 默认输出的字段值外层自动包裹p标签,而Outlook桌面端采用Word作为渲染引擎,对类选择器、非行内样式的支持度极低,调整HTML结构是唯一能保证全邮件客户端兼容的方案,以下是三种可落地的实现方式:
方案1:仅修改当前quote-table.php文件输出(不影响其他模块)
将原有else分支的代码替换为以下内容,先获取输出的HTML字符串再替换p标签为span标签:
<div class="subtitle"> <?php if ( $im ) { $im->display(); } else { // 第三个参数设为false不直接输出,返回HTML字符串 $meta_html = wc_display_item_meta( $item, [], false ); // 替换p标签为span标签 $meta_html = str_replace( ['<p ', '</p>'], ['<span ', '</span>'], $meta_html ); echo $meta_html; } ?> </div>
方案2:全局过滤输出(所有调用wc_display_item_meta的场景都会生效)
将以下代码添加到主题functions.php文件或自定义插件的主文件中,无需修改原有业务代码:
add_filter( 'woocommerce_display_item_meta', function( $html, $item, $args ) { // 可自行添加判断条件,仅在邮件场景下生效 return str_replace( ['<p ', '</p>'], ['<span ', '</span>'], $html ); }, 10, 3 );
方案3:手动输出元数据(完全自定义结构,邮件兼容性最优)
完全弃用wc_display_item_meta的自动输出逻辑,自己控制HTML结构和行内样式,彻底避免多余标签生成:
<div class="subtitle"> <?php if ( $im ) { $im->display(); } else { $meta_list = $item->get_formatted_meta_data(); if ( ! empty( $meta_list ) ) : ?> <ul style="font-size:small;margin:0;padding:0;list-style:none"> <?php foreach ( $meta_list as $meta ) : ?> <li style="margin:0;padding:0"> <strong><?php echo esc_html( $meta->key ); ?>:</strong> <span style="margin:0;color:#8d8d8d;"><?php echo wp_kses_post( $meta->value ); ?></span> </li> <?php endforeach; ?> </ul> <?php endif; } ?> </div>
内容的提问来源于stack exchange,提问作者namari
相关产品推荐
相关产品推荐

