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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:40:35