WooCommerce:禁用AJAX添加商品至购物车时的运费计算
自定义运费插件优化方案
1. 仅在结账页面计算运费
完全可以实现,核心是限制运费计算逻辑只在结账页面触发,同时禁用购物车及AJAX添加商品时的运费计算请求,避免第三方慢响应拖慢操作。
实现代码:
// 仅在结账页面执行自定义运费计算 add_action('woocommerce_calculate_shipping', 'custom_shipping_calculate_only_checkout', 10, 2); function custom_shipping_calculate_only_checkout($package, $shipping) { // 非结账页面直接终止运费计算 if (!is_checkout()) { $shipping->remove_all_shipping_methods(); return; } // 此处编写你的第三方运费API调用逻辑 // 示例:获取费率后添加到运费选项 $third_party_rate = your_third_party_shipping_api_call($package); if ($third_party_rate) { $shipping->add_rate([ 'id' => 'custom_third_party_shipping', 'label' => '第三方配送', 'cost' => $third_party_rate['cost'], 'calc_tax' => 'per_item' ]); } } // 禁用AJAX添加商品时的运费计算触发 add_filter('woocommerce_cart_needs_shipping', 'disable_shipping_on_ajax_add'); function disable_shipping_on_ajax_add($needs_shipping) { if (wp_doing_ajax() && $_POST['action'] !== 'woocommerce_update_order_review') { return false; } return $needs_shipping; } // 移除购物车页面的运费显示区域(可选,避免用户困惑) add_action('woocommerce_cart_collaterals', 'remove_cart_shipping_section', 9); function remove_cart_shipping_section() { remove_action('woocommerce_cart_collaterals', 'woocommerce_cart_totals', 10); // 若需保留其他合计项,可自定义实现购物车合计模板 }
2. 每次加载结账页面时重新计算运费
可以实现,关键是强制清空运费缓存并重新触发计算,确保每次进入结账页都调用第三方API获取最新费率。
实现代码:
// 结账页面初始化时强制重新计算运费 add_action('woocommerce_checkout_init', 'force_refresh_shipping_on_checkout'); function force_refresh_shipping_on_checkout() { // 清除已有的运费计算缓存 if (WC()->session) { WC()->session->set('shipping_for_package_0', null); } // 手动触发运费计算逻辑 WC()->cart->calculate_shipping(); } // 确保第三方运费费率实时刷新(若插件有缓存逻辑需添加) add_filter('woocommerce_shipping_method_is_available', 'refresh_third_party_rate', 10, 3); function refresh_third_party_rate($is_available, $package, $shipping_method) { if (is_checkout() && $shipping_method->id === 'custom_third_party_shipping') { // 重新调用API获取最新费率 $latest_cost = your_third_party_shipping_api_call($package); $shipping_method->set_cost($latest_cost); } return $is_available; }
注意事项:
- 若你的第三方API调用有缓存机制,需确保在结账页面加载时跳过缓存,直接请求最新数据。
- 测试时需验证AJAX添加商品流程,确认不会触发第三方API请求,同时结账页面能正常加载运费。
内容的提问来源于stack exchange,提问作者Denis Volchek
相关产品推荐
相关产品推荐

