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

WooCommerce PDF发票插件:实现含折扣不含税的正确小计显示

解决WooCommerce PDF发票插件中含税订单的「折扣后不含税小计」显示错误问题

嘿,我懂你要的是给会计看的不含税但已扣除折扣的真实商品小计,之前的bug大概率是计算逻辑没区分开含税/不含税的折扣部分,咱们直接上精准的解决方案:

核心思路

我们要的是「商品原始不含税小计 - 商品不含税折扣总额」,而不是用最终订单总价倒推(因为总价包含运费、税费等额外项)。最稳妥的方式是遍历每个订单商品,单独计算每个商品的折扣后不含税金额再求和,这样不管订单是含税还是不含税场景,结果都能精准匹配需求。

具体实现步骤

1. 添加计算逻辑到主题代码

把这段代码复制到你当前WordPress主题的functions.php文件(或者用自定义代码插件,避免主题更新丢失代码):

// 计算折扣后不含税商品小计
function get_discounted_subtotal_ex_tax( $order ) {
    $discounted_subtotal = 0;
    
    // 遍历订单内所有商品,逐个计算折扣后不含税金额
    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        if ( !$product ) continue;
        
        // 商品不含税单价 × 购买数量 = 该商品原始不含税小计
        $original_item_subtotal = $product->get_price_excluding_tax() * $item->get_quantity();
        // 该商品的不含税折扣额(通过原始小计 - 实际支付小计得出)
        $item_discount = $item->get_subtotal() - $item->get_total();
        
        // 累加每个商品的折扣后不含税金额
        $discounted_subtotal += ( $original_item_subtotal - $item_discount );
    }
    
    // 按照订单货币格式输出金额
    return wc_price( $discounted_subtotal, array( 'currency' => $order->get_currency() ) );
}

// 将自定义行注入到PDF发票中
add_action( 'wpo_wcpdf_after_order_details', 'add_discounted_subtotal_to_invoice', 10, 2 );
function add_discounted_subtotal_to_invoice( $template_type, $order ) {
    // 只在发票模板中显示,需要在装箱单也显示的话去掉这个判断
    if ( $template_type !== 'invoice' ) return;
    ?>
    <tr class="discounted-subtotal-ex-tax">
        <th><?php _e( 'Subtotal Discounted (Ex Tax)', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
        <td><?php echo get_discounted_subtotal_ex_tax( $order ); ?></td>
    </tr>
    <?php
}

2. 调整样式(可选)

如果想让这个新行的样式和其他小计行保持一致,可以在插件的「自定义CSS」设置里添加:

.discounted-subtotal-ex-tax th {
    text-align: right;
    padding: 5px 10px;
    font-weight: bold;
}
.discounted-subtotal-ex-tax td {
    text-align: right;
    padding: 5px 10px;
}

为什么之前的实现会出错?

很多人会直接用$order->get_total() - $order->get_total_tax()来计算,但这个值是最终含税总价减去税费,包含了运费、手续费等其他费用,不是单纯的商品折扣后小计。另外,如果你的折扣是按含税金额设置的,直接用$order->get_discount_total()可能拿到的是含税折扣额,导致计算偏差——上面的代码通过遍历商品,直接从商品维度计算不含税折扣,彻底避免了这个问题。

内容的提问来源于stack exchange,提问作者Ming Lu Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:58:16