为Checkout按钮添加购物车小计出现get_subtotal()空对象调用报错如何解决
报错原因
这个报错的核心是gettext是全局触发的过滤器,运行时机非常早,很多场景下WooCommerce的购物车对象还没完成初始化,WC()->cart会返回null,此时调用get_subtotal()方法就会抛出致命错误。常见的触发场景包括后台页面加载、WooCommerce初始化流程未完成、用户首次访问站点还未生成购物车实例等。
修复方案
需要在原有逻辑上增加多层前置判断,避免在购物车对象不存在的场景执行相关逻辑,修复后的代码如下:
add_filter( 'gettext', function( $translated_text ) { // 仅在前端页面匹配Checkout文本时执行逻辑 if ( ! is_admin() && 'Checkout' === $translated_text ) { // 确认WooCommerce已激活,且购物车实例已完成初始化 if ( class_exists( 'WooCommerce' ) && WC() && ! is_null( WC()->cart ) ) { $subtotal = WC()->cart->get_subtotal(); $translated_text = "EXPRESS " . $translated_text . " -$" . $subtotal; // 若需要适配站点的货币格式(如千分位、货币符号位置),可以替换成下面的写法 // $translated_text = "EXPRESS " . $translated_text . " - " . wc_price( $subtotal ); } } return $translated_text; } );
关键修改说明
- 用
!is_admin()过滤后台场景,避免后台页面触发不必要的逻辑 - 增加
class_exists('WooCommerce')判断,防止WooCommerce插件未启用时出现额外报错 - 增加购物车实例非空判断,只有
WC()->cart存在时才调用get_subtotal()方法,从根源上避免null调用错误 - 可选使用
wc_price()方法格式化金额,自动适配站点设置的货币规则,不用手动拼接货币符号
内容的提问来源于stack exchange,提问作者Thisisnuts
相关产品推荐
相关产品推荐

