WooCommerce基于结账自定义选择字段限制配送方式的实现问题
WooCommerce 自定义字段限制配送方式解决方案
你之前的代码不生效核心有两个原因:
- WooCommerce 默认不会将自定义结账字段自动加入配送包的
destination数组,直接读取对应字段为空 - 你原有
woocommerce_package_rates钩子代码中,字段读取语句末尾缺少分号,存在语法错误
完整可用实现代码
// 存储用户提交的自定义区域字段到会话 add_action( 'woocommerce_checkout_update_order_review', 'save_sofiq_kvartal_to_session' ); function save_sofiq_kvartal_to_session( $posted_data ) { parse_str( $posted_data, $output ); if ( isset( $output['sofiq_kvartal'] ) ) { WC()->session->set( 'sofiq_kvartal', wc_clean( $output['sofiq_kvartal'] ) ); } } // 根据自定义区域字段限制配送方式 add_filter( 'woocommerce_package_rates', 'filter_shipping_methods_by_kvartal', 10, 2 ); function filter_shipping_methods_by_kvartal( $rates, $package ) { // 优先读取最新提交的字段值,无提交则读取会话存储值 $kvartal = isset( $_POST['sofiq_kvartal'] ) ? wc_clean( $_POST['sofiq_kvartal'] ) : WC()->session->get( 'sofiq_kvartal' ); // 未选择区域时直接返回原有配送方式 if ( empty($kvartal) ) { return $rates; } // 区域1配置:选择对应区域时禁用 flat_rate:6 配送方式 $zona_1_ids = ["0", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"]; if ( in_array( $kvartal, $zona_1_ids ) ) { unset( $rates['flat_rate:6'] ); } // 可在此扩展其他区域的配送限制逻辑 // $zona_2_ids = [20,44,45]; // if ( in_array( $kvartal, $zona_2_ids ) ) { // unset( $rates['xxx'] ); // } return $rates; } // 可选:如果需要将自定义字段永久加入配送包 destination 数组,可添加以下代码 add_filter( 'woocommerce_calculated_shipping_packages', 'add_kvartal_to_shipping_package_destination' ); function add_kvartal_to_shipping_package_destination( $packages ) { $kvartal = WC()->session->get( 'sofiq_kvartal' ); if ( !empty($kvartal) ) { foreach ( $packages as $key => $package ) { $packages[$key]['destination']['sofiq_kvartal'] = $kvartal; } } return $packages; }
生效注意事项
WooCommerce 会默认缓存配送方式计算结果,代码部署后需要执行以下操作清空缓存才能正常测试:
- 进入后台「WooCommerce - 状态 - 工具」
- 点击「清空购物车缓存」和「清空配送缓存」
- 测试时建议使用浏览器隐身窗口,避免本地缓存影响
内容的提问来源于stack exchange,提问作者Vladimir Kyatipov
相关产品推荐
相关产品推荐

