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
相关产品推荐
相关产品推荐

