WooCommerce 3自定义免运费计算费率:结账页过滤器失效问题
嘿,我之前帮好几个开发者解决过这个问题——你的代码在购物车页正常,但结账页失效,核心原因几乎都是WooCommerce在结账页的配送方式缓存机制在搞鬼,另外你的代码看起来被截断了,先帮你补全并修正:
首先,WooCommerce为了性能优化,会在结账页缓存配送费率数据,默认情况下woocommerce_package_rates过滤器的执行结果会被缓存,导致你的修改不会在结账页触发。解决这个问题的关键是强制清除结账页的配送缓存,同时确保代码逻辑完整。
给你修正后的完整代码:
add_filter( 'woocommerce_package_rates', 'my_custom_shipping', 100, 2 ); function my_custom_shipping( $rates, $package ) { // 针对结账页强制清除配送方式缓存,让过滤器重新执行 if ( is_checkout() && ! is_wc_endpoint_url() ) { WC()->session->set('shipping_methods', null); } // 补全你原本的逻辑,这里以修改免费配送标签为例 foreach($rates as $key => $rate ) { if ( $rate->method_id === "free_shipping" ){ // 示例:修改配送标签为自定义文本 $rates[$key]->label = '免费配送(专属福利)'; // 如果需要调整费用,也可以在这里操作,比如你定义的$percentage变量 // $rates[$key]->cost = $rates[$key]->cost * (1 - $percentage); } } return $rates; } // 当结账页用户更新地址等信息时,刷新配送方式 add_action( 'woocommerce_checkout_update_order_review', 'refresh_checkout_shipping_methods' ); function refresh_checkout_shipping_methods() { WC()->session->set('shipping_methods', null); }
关键说明:
- 加入
is_checkout()判断,只在结账页清除缓存,避免影响购物车页的性能。 woocommerce_checkout_update_order_review动作会在用户修改结账地址、配送信息时触发,确保你的自定义逻辑每次都能生效。- 我补全了你截断的代码部分(修改标签的逻辑),你可以根据自己的需求调整内容。
如果还是不行,建议先切换到WooCommerce默认主题(比如Storefront),禁用其他第三方插件测试——有时候主题或插件会修改配送流程,导致你的过滤器被覆盖。
内容的提问来源于stack exchange,提问作者Eolis
相关产品推荐
相关产品推荐

