2016-07-30 33 views
0

Ich habe diesen Code:

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(); 
    } 
} 

Aber es gibt mir eine Fehlermeldung, weil $ WooCommerce null ist.

Stattdessen, wenn ich diese verwenden:

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(); 
    } 
} 

Alles es richtig und Arbeit ist.

Der Code ist innerhalb einer anderen Funktion ausgeführt woocommerce_init HOOK. Denn nach meinem Wissen sollten beide funktionieren.

Können Sie erklären, warum der erste nicht?

+0

log_cart ist mit welchem ​​Hook im ersten Beispiel verbunden? Kannst du klarer sein? – chugadie

+0

Aktualisiert, um die Struktur meines Codes verständlicher zu machen – Ferex

+0

@LoicTheAztec '$ woocommerce-> cart = new WC_Cart();' tut nichts mehr – Ferex

Antwort

2

Das Verhalten, das Sie beschreiben, ist möglich, wenn Sie auf "woocommerce_loaded" haken, aber es ist nicht möglich, wenn Sie auf "woocommerce_init" haken.

Die letzte Zeile von wp-content/Plugins/WooCommerce/woocommerce.php ist

// Global for backwards compatibility. 
$GLOBALS['woocommerce'] = WC(); 

Dies deutet darauf hin, dass unter Verwendung von global $woocommerce veraltet.

Die letzte Zeile ist globaler Code, der ausgeführt wird, nachdem die Datei enthalten ist. Während der Erstellung der Klasse WC wird der Konstruktor ausgeführt.

/** 
    * WooCommerce Constructor. 
    */ 
    public function __construct() { 
      $this->define_constants(); 
      $this->includes(); 
      $this->init_hooks(); 

      do_action('woocommerce_loaded'); 
    } 

init_hooks() fügt die Init-Funktion von WC zur höheren WP-Init-Aktion hinzu. Dann wird die woocommerce_loaded Aktion ausgelöst. Dies wird ausgelöst vor der Konstruktor abgeschlossen ist, und vor das Objekt wird dem globalen Array hinzugefügt.

Nachdem die Aktion 'woocommerce_loaded' ausgeführt wurde, wird der Konstruktor zurückgegeben und das WC-Objekt wird den Globals hinzugefügt. Es gibt keine Möglichkeit, die Init-Aktion von WP auszulösen, und woocommerce ist darin eingebunden, ohne dass das Globale verfügbar ist.

Dies ist für WC 2.5.5, ich habe den Quellcode zurück auf 2.3.0 überprüft, andere Versionen können anders sein.

Möglicherweise haben Sie ein Rouge-Plugin oder -Thema, das "woocomerce_init" aufruft, bevor das WC() -Objekt erstellt wird oder bevor es zurückkehrt (d. H. In der woocommerce_loaded-Aktion).

Die einzige wirkliche Erklärung ist, dass Ihre Funktion on_woocommerce() von einem anderen Hook oder auf andere Weise versehentlich aufgerufen wird. Es gibt keine Möglichkeit, dass die globale Funktion WC() definiert werden könnte, aber die nächste Zeile des Quellcodes wurde nicht ausgeführt (was das Ergebnis von WC() in einer globalen Variablen speichert).

+0

Ich hake mich in "woocommerce_init" ein – Ferex