Woocommerce结账页特定变体隐藏支付方式代码报错咨询
WooCommerce变体属性控制支付网关功能修复方案
原代码致命错误原因
- 语法错误:所有引号使用了中文弯引号(‘’),PHP无法识别该类符号,插入后直接触发站点致命错误
- 逻辑错误:遍历变体属性的foreach语句末尾多写了分号,导致循环体空执行,属性值判断逻辑完全不生效
- 功能缺失:仅实现了选择"Yes"时禁用COD的逻辑,完全没有覆盖选择"No"时仅保留COD的需求
- 执行范围错误:未限制钩子仅在前端购物车/结账页触发,后台加载时也会执行该逻辑,容易触发后台异常
修正后可直接使用的完整代码
add_filter('woocommerce_available_payment_gateways', 'conditional_payment_gateways', 10, 1); function conditional_payment_gateways($available_gateways) { // 仅前端购物车/结账页执行,避免后台报错 if (is_admin() || !WC()->cart || empty(WC()->cart->get_cart_contents())) { return $available_gateways; } $has_personalization_yes = false; $has_personalization_no = false; $target_attr_slug = 'pa_personalization-required'; // 后台属性的实际slug,默认带pa_前缀 foreach (WC()->cart->get_cart_contents() as $cart_item) { // 仅判断变体商品 if ($cart_item['variation_id'] > 0 && isset($cart_item['variation']) && is_array($cart_item['variation'])) { foreach ($cart_item['variation'] as $attr_key => $attr_value) { if ($attr_key === 'attribute_' . $target_attr_slug) { if (strtolower($attr_value) === 'yes') { $has_personalization_yes = true; } elseif (strtolower($attr_value) === 'no') { $has_personalization_no = true; } } } } } // 选Yes时禁用COD if ($has_personalization_yes) { if (isset($available_gateways['cod'])) { unset($available_gateways['cod']); } } // 选No时仅保留COD if ($has_personalization_no && !$has_personalization_yes) { foreach ($available_gateways as $gateway_id => $gateway) { if ($gateway_id !== 'cod') { unset($available_gateways[$gateway_id]); } } } return $available_gateways; }
使用注意事项
- 代码请添加到当前活跃主题的
functions.php文件末尾,或使用代码片段管理插件插入,禁止修改WordPress、WooCommerce核心文件 - 插入代码前请先备份网站文件与数据库,避免操作失误引发站点异常
- 若代码不生效,请进入WooCommerce商品属性页,确认
Personalization Required属性的实际slug,替换代码中pa_personalization-required的对应值即可 - 若购物车同时存在选"Yes"和选"No"的该类商品,代码默认优先执行禁用COD的逻辑,可根据自身需求调整优先级规则
内容的提问来源于stack exchange,提问作者Shweta Arya
相关产品推荐
相关产品推荐

