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

WooCommerce:基于产品附加组件实现运费覆盖的技术求助

解决WooCommerce礼品盒勾选时调整Royal Mail运费的问题

实现逻辑

  • 自提(Collection)配送方式始终保持免费,不做调整
  • Royal Mail平邮默认运费为£2.75,当购物车中存在勾选了礼品包装盒的商品时,运费自动改为£6

完整代码实现

替换你原有的运费覆盖代码,使用以下代码:

add_filter( 'woocommerce_package_rates', 'adjust_royal_mail_rate_based_on_gift_box', 10, 2 );
function adjust_royal_mail_rate_based_on_gift_box( $rates, $package ) {
    $has_gift_box = false;

    // 遍历购物车商品,检查是否有勾选礼品盒的项
    foreach ( $package['contents'] as $item ) {
        $product_addons = $item['addons'] ?? array();
        
        foreach ( $product_addons as $addon ) {
            // 替换为你实际的礼品盒选项名称(从Product Add-ons设置中获取)
            if ( $addon['name'] === '礼品包装盒' && $addon['value'] === 'Yes' ) {
                $has_gift_box = true;
                break 2; // 找到后直接跳出所有循环
            }
        }
    }

    // 调整配送运费
    foreach ( $rates as $rate_key => $rate ) {
        // 匹配Royal Mail配送方式(可根据实际情况用method_id或label)
        if ( $rate->label === 'Royal Mail' ) {
            $rates[$rate_key]->cost = $has_gift_box ? 6 : 2.75;
            // 同步更新税费计算(如果启用了税费)
            $rates[$rate_key]->taxes = array();
            $rates[$rate_key]->calculate_taxes();
        }
        // 自提方式保持默认免费,无需处理
    }

    return $rates;
}

关键注意事项

  1. 匹配礼品盒选项:代码中$addon['name'] === '礼品包装盒'需要替换为你在WooCommerce Product Add-ons中设置的实际选项名称,若知道选项slug,也可以用$addon['slug'] === '你的礼品盒slug'来判断,准确性更高。
  2. 匹配配送方式:$rate->label === 'Royal Mail'是通过配送方式名称匹配,如果你知道Royal Mail的method_id(比如royalmail),可以替换为$rate->method_id === 'royalmail',更稳定。
  3. 清除运费缓存:代码添加后,需要在WooCommerce后台的「配送」->「配送区域」页面点击「更新」按钮,或者刷新前台购物车页面,确保新的运费规则生效。
  4. 代码位置:将代码添加到当前主题的functions.php文件,或者使用自定义代码插件(如Code Snippets)添加,避免主题更新丢失代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:48:31