我有这段代码:
add_action('woocommerce_init', 'on_woocommerce');
function on_woocommerce(){
function log_cart(){
global $woocommerce;
$cart_content = $woocommerce->cart->get_cart();
log_debug($cart_content,'$cart_content');
}
if(HLP_DEBUG){
log_cart();
}
}
但它给了我错误,因为$ woocommerce是null。
相反,如果我使用它:
add_action('woocommerce_init', 'on_woocommerce');
function on_woocommerce(){
function log_cart(){
$cart_content = WC()->cart->get_cart();
log_debug($cart_content,'$cart_content');
}
if(HLP_DEBUG){
log_cart();
}
}
一切正常且有效。
代码位于 woocommerce_init
HOOK上执行的另一个函数内。我的知识应该都有用。
你能解释为什么第一个没有?
答案 0 :(得分:2)
如果你勾选到" woocommerce_loaded",你所描述的行为是可能的,但如果你挂钩" woocommerce_init"则无法实现。
wp-content / plugins / woocommerce / woocommerce.php的最后一行是
// Global for backwards compatibility.
$GLOBALS['woocommerce'] = WC();
这表明不推荐使用global $woocommerce
。
最后一行是全局代码,在包含文件后运行。因此,在创建类WC期间,构造函数会运行。
/**
* WooCommerce Constructor.
*/
public function __construct() {
$this->define_constants();
$this->includes();
$this->init_hooks();
do_action( 'woocommerce_loaded' );
}
init_hooks()将WC的init函数添加到更高的WP init动作中。然后解雇woocommerce_loaded动作。在构造函数完成之前触发,在对象添加到globals数组之前。
' woocommerce_loaded'动作完成后,构造函数返回,WC对象被添加到全局变量中。 WP的初始行动无法解决,而且没有全球可用的情况下,woocommerce也会被吸引到它。
这是针对WC 2.5.5,我已将源代码检查回2.3.0,其他版本可能不同。
你可能有一个正在调用" woocomerce_init"的胭脂插件或主题。在创建WC()对象之前,或者在它返回之前(即在woocommerce_loaded动作上)。
唯一真正的解释是你的函数on_woocommerce()是从另一个钩子或其他方式被意外调用的。无法定义全局函数WC(),但是下一行源代码没有被执行(它将WC()的结果存储在全局变量中)。