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

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;
}

代码改进点

  1. 空值校验:所有价格获取后都做了有效性判断,避免无效值传入wc_price()触发错误
  2. 促销格式达标:给促销产品的常规价添加了<del>标签,实现删除线效果
  3. 可变产品兼容:处理了可变产品的价格区间显示,同时兼容部分变体无促销价的场景,只有存在有效促销价时才渲染促销相关内容
  4. 逻辑拆分:按产品类型(简单/可变)拆分处理逻辑,更清晰易维护

内容的提问来源于stack exchange,提问作者paulo presa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:25:25