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
相关产品推荐
相关产品推荐

