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

基于指定配送类别调整WooCommerce购物车总重量

问题分析与解决方案

你的代码报错核心原因有两点:

  1. 钩子使用错误:woocommerce_cart_calculate_fees是用来添加订单费用的钩子,并非修改购物车重量的正确钩子,用它调用set_cart_contents_weight()会触发逻辑冲突。
  2. 逻辑不完整:代码固定添加14克,未按实际配送类别情况切换重量,也没处理WooCommerce的重量单位转换(默认多为千克,直接加14会变成14千克而非14克)。

修正后的完整代码

我们把配送类别调整和重量修改合并到同一个钩子中,确保逻辑顺序严谨:

// 将2个信箱件转换为1个标准包裹并调整订单重量
add_action( 'woocommerce_before_calculate_totals', 'adjust_shipping_class_and_weight', 10, 1 );

function adjust_shipping_class_and_weight( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( ! $cart->needs_shipping() ) 
        return;

    $count_343 = 0;
    $count_344 = 0;

    // 统计配送类别343和344的商品总数量
    foreach( $cart->get_cart() as $item ) {
        $shipping_class_id = $item['data']->get_shipping_class_id();
        if ( $shipping_class_id === 343 ) {
            $count_343 += $item['quantity'];
        } elseif ( $shipping_class_id === 344 ) {
            $count_344 += $item['quantity'];
        }
    }

    // 第一步:调整配送类别(保留原逻辑)
    if ( $count_343 >= 2 ) {
        foreach( $cart->get_cart() as $item ) {
            if ( $item['data']->get_shipping_class_id() === 343 ) {
                $item['data']->set_shipping_class_id( 344 );
                // 同步更新统计数量,确保重量计算基于最新状态
                $count_343 -= $item['quantity'];
                $count_344 += $item['quantity'];
            }
        }
    }

    // 第二步:根据条件添加额外重量
    $extra_weight = 0;
    // 注意:若你的WooCommerce重量单位是克,直接写14和54即可;以下是千克单位的转换值
    if ( $count_343 === 1 ) {
        $extra_weight = 0.014;
    } elseif ( $count_344 >= 1 || $count_343 >= 2 ) {
        $extra_weight = 0.054;
    }

    if ( $extra_weight > 0 ) {
        $current_total_weight = $cart->get_cart_contents_weight();
        $cart->set_cart_contents_weight( $current_total_weight + $extra_weight );
    }
}

代码说明

  1. 合并钩子逻辑:将两个操作放在woocommerce_before_calculate_totals中,确保先完成配送类别转换,再基于最新状态计算重量。
  2. 单位适配:根据后台设置的重量单位调整数值,注释中已标注克和千克的转换方式。
  3. 条件覆盖:严格匹配需求:
    • 仅1个343商品时加14克对应重量
    • 存在344商品或多个343商品时加54克对应重量
  4. 状态同步:修改配送类别后更新统计数量,避免重量计算出现偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:05:13