WooCommerce中小计不足时隐藏COD的subtotal属性报错解决
解决WooCommerce中按订单小计禁用COD时的PHP警告问题
错误原因分析
- 原代码未判断
WC()->cart是否存在:在非购物车/结账页面(如后台、产品详情页),WC()->cart对象未初始化,直接访问subtotal会触发"Attempt to read property on null"警告。 - 使用
get_cart_subtotal()的问题:该方法返回带货币符号和格式化的字符串(例如$9.99),无法直接与数字进行大小比较,会导致类型错误。
修正后的代码
add_filter( 'woocommerce_available_payment_gateways', 'ts_disable_cod_based_on_subtotal' ); function ts_disable_cod_based_on_subtotal( $available_gateways ) { // 仅在前端且购物车有效时执行逻辑 if ( is_admin() || ! WC()->cart || WC()->cart->is_empty() ) { return $available_gateways; } $minimum_subtotal = 10; // 订单小计最低阈值(美元) $cart_subtotal = WC()->cart->get_subtotal(); // 获取纯数字的小计值 // 仅当COD网关存在且小计低于阈值时移除 if ( $cart_subtotal < $minimum_subtotal && isset( $available_gateways['cod'] ) ) { unset( $available_gateways['cod'] ); } return $available_gateways; }
关键修改说明
- 增加场景判断:通过
is_admin()跳过后台逻辑,同时检查WC()->cart是否存在、购物车是否为空,彻底避免null警告。 - 正确获取小计:使用
get_subtotal()返回纯数字的订单小计,确保数值比较的准确性。 - 安全移除网关:增加
isset( $available_gateways['cod'] )判断,防止尝试移除未启用的COD网关时出现错误。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

