WooCommerce产品编辑页报错:Call to a member function get_children() on null
解决WooCommerce可变商品编辑页致命错误的方案
问题原因
woocommerce_available_variation钩子不仅在前台商品页触发,后台产品编辑页加载时也会调用该钩子。你的代码或短代码中调用了get_children()方法,但后台环境下对应的WC_Product对象可能未正确初始化,导致对象为null,触发致命错误。
解决方案
通过环境判断和对象安全检查,限制自定义逻辑仅在前台执行,同时增强代码健壮性:
1. 修改钩子回调函数,添加后台跳过逻辑
在你的woocommerce_available_variation钩子处理函数中,先判断是否处于后台环境,直接返回原数据不执行自定义逻辑;同时检查对象有效性:
add_filter('woocommerce_available_variation', 'add_stock_notification_form_to_variation', 10, 3); function add_stock_notification_form_to_variation($variation_data, $product, $variation) { // 后台环境直接返回,不执行自定义逻辑 if (is_admin()) { return $variation_data; } // 双重保险:确保产品对象有效 if (!is_a($product, 'WC_Product') || !is_a($variation, 'WC_Product_Variation')) { return $variation_data; } // 原有的缺货添加表单逻辑 if (!$variation->is_in_stock()) { $variation_data['availability_html'] .= do_shortcode('[form__data]'); } return $variation_data; }
2. 优化短代码实现,添加安全检查
如果你的[form__data]短代码内部也调用了get_children()等产品对象方法,同样需要添加环境和对象检查:
function form__data_shortcode() { // 后台或非商品页直接返回空内容 if (is_admin() || !is_product()) { return ''; } global $product; // 确保当前产品是可变商品对象 if (!is_a($product, 'WC_Product_Variable')) { return ''; } // 原短代码逻辑,比如获取变体列表 $variation_ids = $product->get_children(); // ... 你的到货通知表单生成代码 } add_shortcode('form__data', 'form__data_shortcode');
原理说明
is_admin()判断当前是否处于WordPress后台,直接跳过自定义逻辑,避免后台环境下的对象异常。is_a()检查确保操作的对象是合法的WooCommerce产品实例,防止因对象为null导致的方法调用错误。
内容的提问来源于stack exchange,提问作者jacsoon jacsoon
相关产品推荐
相关产品推荐

