

新闻资讯
技术教程本文介绍如何在 woocommerce 中实现:仅对特定邮编区域(如邻近村庄)且选择配送(非自提)时,强制要求最低订单金额;自提或本地村庄则不受限制。代码兼容最新版本
,支持多邮编匹配与灵活配置。
在餐饮类 WooCommerce 网站中,常需差异化运营策略:例如本店所在村庄(如邮编 82069)支持无门槛配送,而周边村庄(如 82065、82057、82067)需满 50 元才可配送;同时,所有区域的“到店自提”均不设门槛。这要求校验逻辑必须同时满足三个条件:
✅ 当前选择的不是 local_pickup 配送方式;
✅ 收货邮编(优先取 shipping_postcode,降级取 billing_postcode 或客户档案)属于受限制邮编列表;
✅ 购物车总额低于设定阈值。
以下为经优化、健壮性增强的完整解决方案(已修复原代码中邮编获取顺序混乱、空值判断缺失、in_array() 类型匹配隐患等问题):
add_action( 'woocommerce_check_cart_items', 'wc_conditional_minimum_order_amount', 10 );
function wc_conditional_minimum_order_amount() {
// —— 配置区:按需修改 ——
$minimum_amount = 50; // 最低订单金额(单位:站点默认货币)
$excluded_method_id = 'local_pickup'; // 免检配送方式 ID(自提不触发限制)
$restricted_postcodes = array( 82065, 82057, 82067, 9800 ); // 严格匹配的邮编数组(整数更安全)
// 获取购物车总金额(确保为浮点数)
$cart_total = (float) WC()->cart->total;
// 获取已选配送方式(如未选择则跳过校验)
$chosen_methods = (array) WC()->session->get( 'chosen_shipping_methods' );
if ( empty( $chosen_methods ) ) {
return;
}
// 解析主配送方式 ID(兼容 rate ID 如 'flat_rate:1')
$chosen_method = explode( ':', reset( $chosen_methods ) );
$chosen_method_id = reset( $chosen_method );
// 若选择的是自提,则直接退出,不校验金额
if ( $chosen_method_id === $excluded_method_id ) {
return;
}
// —— 邮编获取逻辑(多层兜底,确保可靠性)——
$postcode = '';
// 1. 优先从客户对象获取(已保存的配送地址)
if ( $postcode = WC()->customer->get_shipping_postcode() ) {
// 已存在,直接使用
}
// 2. 否则尝试从表单 POST 数据中获取(结账页实时输入)
elseif ( isset( $_POST['shipping_postcode'] ) && ! empty( $_POST['shipping_postcode'] ) ) {
$postcode = sanitize_text_field( $_POST['shipping_postcode'] );
}
// 3. 再次降级:取账单邮编(当未填配送地址时)
elseif ( isset( $_POST['billing_postcode'] ) && ! empty( $_POST['billing_postcode'] ) ) {
$postcode = sanitize_text_field( $_POST['billing_postcode'] );
}
// 4. 最终兜底:客户档案中的账单邮编
elseif ( $postcode = WC()->customer->get_billing_postcode() ) {
// 已存在
}
// 若仍无法获取有效邮编,终止校验(避免误拦截)
if ( empty( $postcode ) ) {
return;
}
// 将邮编转为整数(去除空格、前导零等干扰,适配整数型邮编数组)
$clean_postcode = (int) preg_replace( '/\D/', '', $postcode );
// 关键校验:金额不足 + 邮编在受限列表中 → 显示错误提示
if ( $cart_total < $minimum_amount && in_array( $clean_postcode, $restricted_postcodes, true ) ) {
wc_add_notice(
sprintf(
__( '配送服务仅对 %s 及以上订单开放(当前订单金额:%s)。', 'woocommerce' ),
wc_price( $minimum_amount ),
wc_price( $cart_total )
),
'error'
);
// 【可选】隐藏“去结算”按钮,提升用户体验一致性
add_filter( 'woocommerce_is_checkout_resumed', '__return_false' );
remove_action( 'woocommerce_proceed_to_checkout', 'woocommerce_button_proceed_to_checkout', 20 );
}
}该方案以轻量、可靠、易维护为核心,无需插件即可实现精细化地域化订单策略,助力本地商家精准控制履约成本与用户体验平衡。