WooCommerce外部创建商品加购时设置配送类无效果求助
问题根源
你现在用woocommerce_add_cart_item_data加的shipping_class只是存在购物车项的自定义数据里而已,WooCommerce算运费的时候根本不会读这个值——它默认看的是产品/变体本身设置的配送类,所以购物车运费自然没变化。
正确解决办法
要让自定义配送类生效,得用woocommerce_cart_product_shipping_class这个钩子来覆盖购物车项的配送类判断逻辑。下面给你两种可行的实现方式:
方式1:直接在运费计算时判断设置
如果你的尺寸条件能直接从产品对象拿到(比如产品的元字段、属性),直接这么写就行:
function override_cart_item_shipping_class( $shipping_class, $product, $cart_item ) { // 把这里换成你的尺寸判断逻辑 // 举个例子:假设从产品元数据里取尺寸值 $product_size = get_post_meta( $product->get_id(), 'product_size', true ); if ( 'small' === $product_size ) { // 返回你设置的配送类别名(也就是"test-small") return 'test-small'; } // 其他尺寸的判断逻辑可以接着加... // 不符合条件的话就返回原来的配送类 return $shipping_class; } add_filter( 'woocommerce_cart_product_shipping_class', 'override_cart_item_shipping_class', 10, 3 );
方式2:先存配送类到购物车项,再在运费计算时读取
如果你的尺寸判断是在添加购物车时确定的(比如外部向导传过来的临时数据),可以先把配送类存到购物车项里,再在算运费的时候读出来用:
第一步:把配送类存到购物车项数据里
function add_shipping_class_to_cart_item_data( $cart_item_data, $product_id, $variation_id ) { // 这里换成你的尺寸判断逻辑 // 比如:假设外部向导通过GET参数传了尺寸信息 $product_size = isset( $_GET['product_size'] ) ? sanitize_text_field( $_GET['product_size'] ) : ''; if ( 'small' === $product_size ) { // 把自定义配送类存到购物车项里 $cart_item_data['custom_shipping_class'] = 'test-small'; // 加个唯一键,确保每次添加都能触发更新 $cart_item_data['unique_key'] = md5( microtime() . rand() ); } return $cart_item_data; } add_filter( 'woocommerce_add_cart_item_data', 'add_shipping_class_to_cart_item_data', 10, 3 );
第二步:读取购物车项里的配送类,覆盖默认判断
function apply_custom_shipping_class_to_cart_item( $shipping_class, $product, $cart_item ) { // 检查购物车项里有没有存自定义配送类 if ( isset( $cart_item['custom_shipping_class'] ) ) { return $cart_item['custom_shipping_class']; } // 没有的话就返回原来的配送类 return $shipping_class; } add_filter( 'woocommerce_cart_product_shipping_class', 'apply_custom_shipping_class_to_cart_item', 10, 3 );
验证步骤
- 把上面的代码加到你的
custom-functions.php里 - 加对应尺寸的商品到购物车
- 刷新购物车页面,看看运费是不是按
test-small配送类的配置算了
注意:一定要确保配送类的别名完全匹配(大小写也不能错),而且对应的配送方式已经正确配置了这个配送类的费用规则。
内容的提问来源于stack exchange,提问作者xgarb
相关产品推荐
相关产品推荐

