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

