Dokan商店关闭时禁止加购代码报Call to a member function get_id()错误如何修复
错误原因
- 原代码依赖全局
$product变量获取商品对象,但woocommerce_is_purchasable钩子触发的部分场景下,全局商品对象尚未完成初始化,值为null,调用get_id()方法就会触发成员函数调用的致命错误。 - 原代码没有正确接收
woocommerce_is_purchasable钩子默认传递的商品对象参数,反而依赖可靠性低的全局变量是核心问题。
修复代码
将你原有的代码替换为以下内容即可:
add_filter( 'woocommerce_is_purchasable', function($is_purchasable, $product) { // 商品对象有效性校验,异常场景直接返回原状态 if ( !is_a($product, 'WC_Product') ) { return $is_purchasable; } $seller_id = get_post_field('post_author', $product->get_id()); // 兼容Dokan插件停用的场景,避免函数不存在报错 if ( function_exists('dokan_is_store_open') ) { $is_purchasable = dokan_is_store_open( $seller_id ); } return $is_purchasable; }, 1000, 2);
修复说明
- 回调末尾新增的参数
2,用于声明该回调需要接收钩子传递的2个参数(原可购买状态、商品对象),直接使用WooCommerce官方传入的可靠商品对象,完全不需要依赖全局变量。 - 新增的类型校验和函数存在性校验,可以兼容插件停用、异常调用等边缘场景,不会触发站点报错。
- 简化了原有逻辑,直接返回店铺状态的布尔值即可,不需要额外赋值判断。
内容的提问来源于stack exchange,提问作者booak
相关产品推荐
相关产品推荐

