You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:12:56