WooCommerce新手求助:如何限制特定产品ID仅配送至指定邮编?
实现WooCommerce特定产品仅配送至指定邮编的功能
原代码的问题说明
- PHP中不等于运算符应为
!=(松散比较)或!==(严格比较),你用了≠会触发语法错误 - 获取用户邮编的方式错误,正确方式是调用
WC()->customer->get_shipping_postcode()(配送邮编)或WC()->customer->get_billing_postcode()(账单邮编) - 未判断购物车中是否包含需限制的产品,原逻辑会对所有产品生效,不符合需求
- 在
woocommerce_available_payment_gateways过滤器内动态添加动作,可能导致重复输出通知
完整实现代码
将以下代码添加到主题的functions.php文件中:
// 定义需要限制配送的产品ID数组和允许的邮编 define('RESTRICTED_PRODUCT_IDS', array(10, 20, 30)); // 替换为你的10个目标产品ID define('ALLOWED_ZIPCODES', array('713102')); // 替换为允许配送的邮编,多个邮编可添加进数组 add_filter('woocommerce_available_payment_gateways', 'restrict_payment_for_specific_products_by_zip', 20, 1); function restrict_payment_for_specific_products_by_zip($gateways) { // 仅在结账页面生效 if (!is_checkout() || is_wc_endpoint_url()) { return $gateways; } $has_restricted_product = false; $user_zipcode = WC()->customer->get_shipping_postcode(); // 检查购物车是否包含限制产品 foreach (WC()->cart->get_cart() as $cart_item) { if (in_array($cart_item['product_id'], RESTRICTED_PRODUCT_IDS)) { $has_restricted_product = true; break; } } // 若有限制产品且邮编不在允许列表,隐藏COD网关(可按需修改网关ID) if ($has_restricted_product && !in_array($user_zipcode, ALLOWED_ZIPCODES)) { if (isset($gateways['cod'])) { unset($gateways['cod']); } // 添加配送限制提示 add_action('woocommerce_checkout_before_order_review', 'show_delivery_restriction_notice'); } return $gateways; } function show_delivery_restriction_notice() { wc_print_notice(__('您购物车中的部分产品仅支持配送至指定邮编,请检查配送地址或移除相关产品。', 'woocommerce'), 'error'); }
代码说明
RESTRICTED_PRODUCT_IDS:替换为需要限制配送的产品ID,多个ID用逗号分隔ALLOWED_ZIPCODES:可添加多个允许的邮编,格式为array('713102', '713103')- 逻辑会先检测购物车是否含限制产品,再验证用户配送邮编,不符合条件则隐藏COD支付网关并显示错误提示
- 若需隐藏配送方式而非支付网关,可改用
woocommerce_package_rates过滤器替换上述逻辑
内容的提问来源于stack exchange,提问作者Swarno Digital
相关产品推荐
相关产品推荐

