2016-07-30 3 views
0

У меня есть этот код:

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 равна нулю.

Вместо если я использую это:

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

log_cart подключен к этому крючку в первом примере? Можете ли вы быть более ясными? – chugadie

+0

Обновлено, чтобы сделать структуру моего кода более понятной – Ferex

+0

@LoicTheAztec '$ woocommerce-> cart = new WC_Cart();' ничего не делает – Ferex

ответ

2

Поведение, которое вы описываете, возможно, если вы подключаетесь к «woocommerce_loaded», но это невозможно, если вы подключаетесь к «woocommerce_init».

В последней строке WP-содержание/плагины/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 к более высокому действию WP init. Затем выполняется действие woocommerce_loaded. Это запущено до, а конструктор завершает, и до объект добавляется в массив глобалов.

После выполнения действия woocommerce_loaded конструктор возвращается, а объект WC добавляется в глобальные переменные. Невозможно запустить действие инициации WP, и woocommerce подключается к нему, без доступности глобального.

Это для WC 2.5.5, я проверил исходный код на 2.3.0, другие версии могут отличаться.

Возможно, у вас есть плагин rouge или тема, вызывающая «woocomerce_init» перед созданием объекта WC() или до его возвращения (т. Е. В действие woocommerce_loaded).

Единственное реальное объяснение заключается в том, что ваша функция on_woocommerce() вызывается из другого крючка или иным образом случайно. Невозможно определить глобальную функцию WC(), но следующая строка исходного кода не была выполнена (которая хранит результат WC() в глобальной переменной).

+0

Я подключаюсь к "woocommerce_init" – Ferex

Смежные вопросы