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

WooCommerce多供应商场景无需插件/自定义插件实现拆分运费

WooCommerce按供应商拆分配送实现方案

需求说明

我们需要在WooCommerce的购物车与结算页面计算并展示配送方式,支持两种实现逻辑:

  • 为每个供应商单独计算并展示配送费率
  • 分别累加每个供应商的配送成本后,在购物车页面展示最终总配送费用
    不需要使用第三方插件,可通过主题functions.php添加代码或自行开发自定义插件完成。

现有基础逻辑

目前已经实现了按配送类型拆分包裹的逻辑,参考代码如下:

$packages[] = array(
                'ship_via' => $shipping_method_ids ?: array('flat_rate', 'local_pickup', 'free_shipping'),
                'name' => $shipping_class_name,
                'contents' => $new_package,
                'contents_cost' => array_sum(wp_list_pluck($new_package, 'line_total')),
                'applied_coupons' => WC()->cart->applied_coupons,
                'destination' => array(
                    'country' => WC()->customer->get_shipping_country(),
                    'state' => WC()->customer->get_shipping_state(),
                    'postcode' => WC()->customer->get_shipping_postcode(),
                    'city' => WC()->customer->get_shipping_city(),
                    'address' => WC()->customer->get_shipping_address(),
                    'address_2' => WC()->customer->get_shipping_address_2()
                )
            );

按供应商拆分的实现代码

首先假设你已经给商品设置了供应商自定义字段,_vendor_id存储供应商ID,_vendor_name存储供应商名称,可直接使用如下代码实现拆分:

add_filter('woocommerce_cart_shipping_packages', 'split_shipping_packages_by_vendor');
function split_shipping_packages_by_vendor($packages) {
    $vendor_packages = array();
    // 遍历购物车商品按供应商分组
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        // 获取商品对应的供应商信息
        $vendor_id = get_post_meta($product->get_id(), '_vendor_id', true);
        $vendor_name = get_post_meta($product->get_id(), '_vendor_name', true);
        // 兜底处理无供应商的商品
        if (empty($vendor_id)) {
            $vendor_id = 'default';
            $vendor_name = '其他商家';
        }
        // 初始化供应商分组
        if (!isset($vendor_packages[$vendor_id])) {
            $vendor_packages[$vendor_id] = array(
                'ship_via' => array('flat_rate', 'local_pickup', 'free_shipping'), // 可自定义该供应商支持的配送方式
                'name' => $vendor_name,
                'contents' => array(),
                'contents_cost' => 0,
                'applied_coupons' => WC()->cart->applied_coupons,
                'destination' => array(
                    'country' => WC()->customer->get_shipping_country(),
                    'state' => WC()->customer->get_shipping_state(),
                    'postcode' => WC()->customer->get_shipping_postcode(),
                    'city' => WC()->customer->get_shipping_city(),
                    'address' => WC()->customer->get_shipping_address(),
                    'address_2' => WC()->customer->get_shipping_address_2()
                )
            );
        }
        // 将商品加入对应供应商分组
        $vendor_packages[$vendor_id]['contents'][$cart_item_key] = $cart_item;
        $vendor_packages[$vendor_id]['contents_cost'] += $cart_item['line_total'];
    }
    return array_values($vendor_packages);
}

实现效果

代码生效后,购物车和结算页的配送选项会按供应商拆分展示:

  • 供应商A -> 对应配送选项(1,2,3..)
  • 供应商B -> 对应配送选项(1,2,3..)
  • 供应商C -> 对应配送选项(1,2,3..)
    效果示意图:
    效果示意图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:39:01