WooCommerce访问商品详情页自动加购出现get_id()空对象错误如何解决
错误产生原因
这个报错的核心原因是全局$product对象在非商品详情页场景下未被初始化:
- 你使用的
template_redirect是全站全局触发的钩子,不止商品详情页,访问首页、分类页、订单页、购物车页等所有前端页面都会触发这个钩子 - 只有在标准WooCommerce商品详情页上下文中,全局
$product才会被赋值为当前商品的WC_Product对象,其他场景下$product为null,此时直接调用get_id()方法就会抛出对应错误
修复方案
你需要先添加前置判断,只有满足「当前是商品详情页 + 商品对象有效」的条件才执行加购逻辑,优化后代码如下:
add_action( 'template_redirect', 'add_product_to_cart' ); function add_product_to_cart() { // 仅前端商品详情页执行逻辑 if ( ! is_admin() && is_product() ) { global $product; // 额外校验商品对象有效性,兼容异常场景 if ( ! $product instanceof WC_Product ) { $product = wc_get_product( get_queried_object_id() ); if ( ! $product ) return; } $product_id = $product->get_id(); // 直接用WC原生方法判断商品是否已在购物车,无需自行循环 if ( ! WC()->cart->find_product_in_cart( WC()->cart->generate_cart_id( $product_id ) ) ) { WC()->cart->add_to_cart( $product_id ); } } }
修复点说明
- 新增
is_product()判断,限定逻辑仅在商品详情页执行 - 新增
$product有效性校验,即使全局商品对象异常也可以通过当前查询ID获取商品,避免空对象调用 - 替换自行循环购物车的逻辑为WooCommerce原生的
find_product_in_cart方法,代码更简洁兼容性更好
内容的提问来源于stack exchange,提问作者Guru Surfer
相关产品推荐
相关产品推荐

