空的$ woocommerce全局变量(WC()工作)

时间:2016-07-30 14:49:11

标签: php wordpress woocommerce cart

我有这段代码:

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上执行的另一个函数内。我的知识应该都有用。

你能解释为什么第一个没有?

1 个答案:

答案 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()的结果存储在全局变量中)。