开发WooCommerce插件时遇到致命错误:Uncaught Error: Call to a member function get_type() on string
解决WooCommerce插件中的致命错误
看起来你的问题出在两个关键细节上:手动加载wp-load.php的错误方式,以及在wp_head钩子中依赖未正确初始化的$product全局变量。让我一步步帮你梳理解决:
1. 移除手动引入wp-load.php的代码
直接写require_once ($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');是非常不规范的做法。WordPress的插件加载机制会自动完成环境初始化,手动引入不仅会导致重复加载、路径适配错误(比如站点不在服务器根目录时),还可能直接触发致命错误。直接删掉这行代码就好。
2. 修正产品对象的获取逻辑
在wp_head钩子执行时,$product全局变量可能还没被正确初始化(比如缓存页面、自定义模板场景下),直接调用$product->get_type()会因为$product是null或非WC_Product对象而报错。
你应该改用WooCommerce官方提供的安全方式获取产品对象,同时增加有效性校验。修正后的代码如下:
add_action( 'wp_head', 'my_custom_plugin' ); function my_custom_plugin() { // 先确认当前是产品页面 if (is_product()) { // 通过当前查询对象ID获取产品,再实例化产品对象 $product_id = get_queried_object_id(); $product = wc_get_product($product_id); // 确保产品对象有效后再执行逻辑 if ($product instanceof WC_Product) { $product_type = $product->get_type(); if ($product_type == 'variable') { // 这里写你的业务逻辑 } } } }
额外优化建议
如果你的业务逻辑不需要在wp_head中执行,更推荐使用WooCommerce专属的产品钩子(比如woocommerce_single_product_summary),这类钩子会确保产品对象已经完全初始化,能从根源避免类似问题。另外,开发插件时尽量依赖官方提供的函数,减少对全局变量的依赖,代码会更健壮、兼容性更强。
内容的提问来源于stack exchange,提问作者Giannis Margetis
相关产品推荐
相关产品推荐

