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

WooCommerce已完成订单税费重算:从订单总额中扣除税费

问题:已完成WooCommerce订单重算税费时,需从订单总额中拆分税费(而非额外添加)

背景

  • WordPress商店集成WooCommerce,配置为产品价格含税,搭配Germanized for WooCommerce插件
  • 曾关闭WooCommerce税费功能,期间生成的已完成订单未计算税费
  • 已通过以下代码让已完成订单可编辑:
add_filter( 'wc_order_is_editable', 'make_order_editable', 9999, 2 );
 
function make_order_editable( $allow_edit, $order ) {
    if ( $order->get_status() === 'completed' ) {
        $allow_edit = true;
    }
    return $allow_edit;
}

当前问题

点击订单编辑页的「重新计算」按钮时,WooCommerce默认会将税费追加到订单总额中,导致总额增加。但需求是:基于原订单的含税总额,从中拆分出税费部分,保持订单总额不变。

此前尝试的以下代码均未生效:

代码1(无效)

function custom_recalculate_order_total($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }
    if (isset($_POST['calculate-action'])) {
        // Get the order ID
        $order_id = isset($_POST['post_ID']) ? intval($_POST['post_ID']) : 0;

        if ($order_id > 0) {
            // Get the order
            $order = wc_get_order($order_id);
            $order_total = $order->get_total();
            $tax = $order->get_total_tax();
            $new_total = $order_total - $tax;
            $order->set_total($new_total);
            $order->save();
        }
    }
}
add_action('woocommerce_after_save_order_items', 'custom_recalculate_order_total', 10, 1);

代码2(无效)

function custom_adjust_tax_on_recalculate($taxes, $cart) {
    if (isset($_POST['calculate-action'])) {
        // Get the order subtotal before tax
        $subtotal = $cart->cart_contents_total;
        $tax_rate = 0.10;
        $tax_amount = $subtotal * $tax_rate;
        $taxes = array(
            'tax_total' => $tax_amount,
        );
    }
    return $taxes;
}
add_filter('woocommerce_cart_totals_taxes', 'custom_adjust_tax_on_recalculate', 10, 2);

代码3(无效)

add_action("woocommerce_order_before_calculate_taxes", "custom_order_before_calculate_taxes", 10, 2);
function custom_order_before_calculate_taxes($order, $args) {
    if (isset($_POST['calculate-action'])) {
        $subtotal = $order->get_subtotal();
        $tax_rate = 0.10;
        $tax_amount = $subtotal * $tax_rate;
        $order->set_total_tax($tax_amount);
    }
}

解决方案

使用以下代码,在税费计算完成后强制锁定订单总额为原含税总价,拆分出税费和不含税小计:

add_action( 'woocommerce_order_after_calculate_taxes', 'adjust_order_total_after_tax_calculation', 10, 2 );
function adjust_order_total_after_tax_calculation( $order, $calculate_tax_for ) {
    // 仅后台订单编辑页触发重算时执行
    if ( ! is_admin() || ! isset( $_POST['calculate-action'] ) ) {
        return;
    }

    // 获取原订单总额(重算前的含税总价)
    $original_total = $order->get_meta( '_order_total', true );
    if ( empty( $original_total ) ) {
        $original_total = $order->get_total();
    }

    // 获取计算后的税费金额
    $calculated_tax = $order->get_total_tax();

    // 计算不含税小计:原总额 - 税费
    $new_subtotal = $original_total - $calculated_tax;

    // 更新订单数据,保持总额不变
    $order->set_subtotal( $new_subtotal );
    $order->set_total( $original_total );
    
    $order->save();
}

注意事项

  1. 操作前请备份订单数据,避免意外
  2. 若与Germanized for WooCommerce插件冲突,可临时禁用插件测试,再排查兼容逻辑
  3. 代码需添加至当前主题的functions.php文件,或使用自定义代码插件管理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:28:16