在WooCommerce中为特定属性值的可变商品禁用指定支付方式
修复WooCommerce根据商品属性禁用支付方式的代码
原代码存在以下问题导致无法正常运行:
- 遍历商品所有属性时,只要属性值匹配就计数,单个商品多属性时会重复计数,导致判断逻辑错误
- 将
$flag的判断放在循环内部,每次循环都会覆盖结果,逻辑混乱 - 未精准定位
vol属性,可能误判其他属性值匹配的情况
修正后的代码如下:
function modify_available_payment_gateways($gateways) { // 仅在结账页面执行,避免不必要的资源消耗 if (!is_checkout()) { return $gateways; } $cart = WC()->cart; if (!$cart || $cart->is_empty()) { return $gateways; } $all_small_volume = true; // 默认所有商品都是小容量(3ml/5ml/10ml) foreach ($cart->get_cart() as $cart_item) { $product = $cart_item['data']; // 仅处理可变商品 if ($product->is_type('variation')) { // 获取vol属性的值,注意属性名可能需要调整为实际的slug,比如'pa_vol' $vol_value = $product->get_attribute('vol'); // 如果vol值不在目标范围内,标记为存在非小容量商品 if (!in_array($vol_value, ['3ml', '5ml', '10ml'])) { $all_small_volume = false; break; // 找到不符合的就跳出循环,不用继续判断 } } else { // 如果购物车存在非可变商品,直接允许支付方式 $all_small_volume = false; break; } } // 如果所有商品都是指定小容量,禁用snapppay if ($all_small_volume) { wc_clear_notices(); wc_add_notice(__('因购物车仅包含小容量商品,暂不支持该支付方式。', 'woocommerce'), 'error'); unset($gateways['snapppay']); } return $gateways; } add_filter('woocommerce_available_payment_gateways', 'modify_available_payment_gateways');
代码说明:
- 先判断是否处于结账页面,避免在其他页面无效执行
- 初始化标记变量,默认假设所有商品都是符合条件的小容量规格
- 遍历购物车商品时,精准定位
vol属性值,只要发现一个商品不符合规格,就立即跳出循环并修改标记 - 若购物车存在非可变商品,直接允许使用snapppay支付方式
- 最终根据标记结果,决定是否禁用支付方式并添加提示通知
内容的提问来源于stack exchange,提问作者aligh
相关产品推荐
相关产品推荐

