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

基于WooCommerce购物车商品配送类与数量显示补贴总额的问题

修复WooCommerce基于配送类计算并显示补贴总额的问题

原代码存在多个逻辑和语法错误,以下是修正后的完整实现方案:

原代码核心问题

  • 变量作用域错误:$quantity、$product等变量在循环外定义,无法获取当前购物车项的对应数据
  • 循环内提前返回:第一次循环就直接返回结果,无法统计所有购物车商品的补贴总额
  • 变量初始化错误:$subsidio_total初始化为字符串,会导致数值加法运算异常
  • 函数调用错误:拼写错误且误用对象调用方式,实际应为全局函数调用
  • 未处理无配送类的情况:会触发get_term返回false,进而调用slug属性报错

修正后的完整代码

/**
 * 计算购物车商品的总补贴金额
 * 
 * @return float
 */
function get_subsidies_total() {
    $subsidio_total = 0;

    // 确保购物车对象存在
    if ( ! WC()->cart ) {
        return $subsidio_total;
    }

    $cart = WC()->cart;

    // 遍历所有购物车商品
    foreach ( $cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $quantity = $cart_item['quantity'];
        $shipping_class_id = $product->get_shipping_class_id();

        // 仅当商品有有效配送类时计算补贴
        if ( empty( $shipping_class_id ) ) {
            continue;
        }

        $shipping_class_term = get_term( $shipping_class_id, 'product_shipping_class' );

        // 验证配送类术语有效性
        if ( ! is_a( $shipping_class_term, 'WP_Term' ) ) {
            continue;
        }

        // 根据配送类slug匹配补贴金额
        switch ( $shipping_class_term->slug ) {
            case 'envio-gratis-o-preferente-125':
                $subsidio_subtotal = 125;
                break;
            case 'envio-gratis-o-preferente-73':
                $subsidio_subtotal = 73;
                break;
            case 'envio-preferente-50':
                $subsidio_subtotal = 50;
                break;
            case 'envio-preferente-30':
                $subsidio_subtotal = 30;
                break;
            case 'envio-preferente-25':
                $subsidio_subtotal = 25;
                break;
            case 'envio-preferente-12-50':
                $subsidio_subtotal = 12.5;
                break;
            case 'envio-preferente-5':
                $subsidio_subtotal = 5;
                break;
            default:
                $subsidio_subtotal = 0;
                break;
        }

        // 累加当前商品的补贴金额
        $subsidio_total += ( $quantity * $subsidio_subtotal );
    }

    return $subsidio_total;
}

/**
 * 在购物车页面显示补贴总额
 */
add_action( 'woocommerce_cart_totals_before_shipping', 'display_subsidies_total', 10 );
/**
 * 在结账页面显示补贴总额
 */
add_action( 'woocommerce_review_order_before_shipping', 'display_subsidies_total', 10 );

function display_subsidies_total() {
    $subsidio_total = get_subsidies_total();

    // 仅当补贴金额大于0时显示
    if ( $subsidio_total > 0 ) {
        ?>
        <tr class="cart-subtotal">
            <th><?php esc_html_e( '补贴总额', 'woocommerce' ); ?></th>
            <td><?php echo wc_price( $subsidio_total ); ?></td>
        </tr>
        <?php
    }
}

关键修改说明

  1. 调整变量作用域:将$product、$quantity等变量移入循环内部,确保每次循环获取当前购物车项的对应数据
  2. 修正返回逻辑:将return语句移至循环结束后,保证统计所有商品的补贴总额
  3. 初始化数值变量:将$subsidio_total初始化为0,确保数值运算正常
  4. 增加有效性判断:验证配送类术语的有效性,避免无配送类商品导致的报错
  5. 优化匹配逻辑:用switch替代多分支if-else,代码更简洁易维护
  6. 适配双页面显示:同时添加购物车和结账页的钩子,确保两处都能显示补贴
  7. 统一页面样式:采用WooCommerce原生表格行结构,保持页面风格一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:22:08