WooCommerce含税/不含税价格代码修复:变体无促销价时致命错误
修复WooCommerce含税/不含税价格显示问题(解决部分变体无促销价时的致命错误)
问题根源
你的代码在遇到部分变体无促销价的可变产品时,get_variation_sale_price()会返回空值或false,直接传给wc_price()就会触发致命错误;同时原代码也没完全实现促销产品常规价显示删除线的要求。
修正后的代码
add_filter( 'woocommerce_get_price_html', 'my_price_prefix_suffix', 100, 2 ); function my_price_prefix_suffix( $price_html, $product ) { // 初始化不含税价格HTML片段 $ex_tax_html = ''; // 处理简单/外部产品 if ( $product->is_type('simple') || $product->is_type('external') ) { if ( $product->is_on_sale() ) { $sale_price = $product->get_sale_price(); $regular_price = $product->get_regular_price(); // 确保价格有效才进行拼接 if ( $sale_price && $regular_price ) { $price_html = sprintf( '<del>%s c/IVA</del> %s c/IVA | %s s/IVA', wc_price($regular_price), wc_price($sale_price), wc_price($sale_price) ); } } else { $regular_price = $product->get_regular_price(); if ( $regular_price ) { $price_html .= sprintf(' c/IVA | %s s/IVA', wc_price($regular_price)); } } } // 处理可变产品 elseif ( $product->is_type('variable') && $product->is_in_stock() ) { $min_regular = $product->get_variation_regular_price('min'); $max_regular = $product->get_variation_regular_price('max'); $min_sale = $product->get_variation_sale_price('min'); $max_sale = $product->get_variation_sale_price('max'); if ( $product->is_on_sale() && $min_sale ) { // 构建常规价区间的删除线格式 $regular_part = ($min_regular !== $max_regular) ? sprintf('<del>%s - %s c/IVA</del>', wc_price($min_regular), wc_price($max_regular)) : sprintf('<del>%s c/IVA</del>', wc_price($min_regular)); // 构建促销价区间格式 $sale_part = ($min_sale !== $max_sale) ? sprintf('%s - %s c/IVA', wc_price($min_sale), wc_price($max_sale)) : sprintf('%s c/IVA', wc_price($min_sale)); // 构建不含税促销价区间格式 $ex_tax_part = ($min_sale !== $max_sale) ? sprintf(' | %s - %s s/IVA', wc_price($min_sale), wc_price($max_sale)) : sprintf(' | %s s/IVA', wc_price($min_sale)); $price_html = $regular_part . ' ' . $sale_part . $ex_tax_part; } else { if ( $min_regular ) { $price_html .= ' c/IVA | '; // 处理非促销的价格区间 $price_html .= ($min_regular !== $max_regular) ? sprintf('%s - %s s/IVA', wc_price($min_regular), wc_price($max_regular)) : sprintf('%s s/IVA', wc_price($min_regular)); } } } return $price_html; }
代码改进点
- 空值校验:所有价格获取后都做了有效性判断,避免无效值传入
wc_price()触发错误 - 促销格式达标:给促销产品的常规价添加了
<del>标签,实现删除线效果 - 可变产品兼容:处理了可变产品的价格区间显示,同时兼容部分变体无促销价的场景,只有存在有效促销价时才渲染促销相关内容
- 逻辑拆分:按产品类型(简单/可变)拆分处理逻辑,更清晰易维护
内容的提问来源于stack exchange,提问作者paulo presa
相关产品推荐
相关产品推荐

