2016-07-30 6 views
0

私はこのコードを持っている(WCは()の代わりに動作します)。

私はこれを使用する代わりに、場合:それが正しいと作業だ

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フックで実行される別の関数の中にあります。私の知識は何のためにもうまくいくはずです。

最初のものがなぜそうでないのか説明できますか?

+0

log_cartは最初の例ではどのフックに接続されていますか?あなたはもっと明確になりますか? – chugadie

+0

私のコードの構造を理解しやすくするために更新されました – Ferex

+0

@LoicTheAztec '' $ woocommerce-> cart = new WC_Cart(); 'は何もしません – Ferex

答えて

2

"woocommerce_loaded"にフックすると、あなたの動作は可能ですが、 "woocommerce_init"にフックするとできません。

WP-コンテンツ/プラグイン/ woocommerce/woocommerce.phpの最後の行は、これはglobal $woocommerceを使用して廃止されていることを示唆している

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

あります。

最終行はグローバルコードで、ファイルが含まれた後に実行されます。したがって、クラスWCの作成中に、コンストラクタが実行されます。

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

      do_action('woocommerce_loaded'); 
    } 

init_hooks()は、より高いWP initアクションにWCのinit関数を追加します。その後、woocommerce_loadedアクションが発生します。これは、の前に実行され、コンストラクタが完了し、の前にのオブジェクトがグローバル配列に追加されます。

'woocommerce_loaded'アクションが完了すると、コンストラクタが戻り、WCオブジェクトがグローバルに追加されます。 WPのinitアクションを起動する方法はありません.Woocommerceは、グローバルにアクセスすることなく、起動されます。

これはWC 2.5.5用ですが、2.3.0に戻ってソースコードを確認しましたが、他のバージョンは異なる場合があります。

WC()オブジェクトが作成される前、または返される前(woocommerce_loadedアクション)には、「woocomerce_init」を呼び出しているルージュプラグインまたはテーマがあります。

実際の説明は、あなたの関数on_woocommerce()が別のフックまたは別の方法で誤って呼び出されていることだけです。グローバル関数WC()を定義することはできませんが、ソースコードの次の行は実行されていません(WC()の結果をグローバル変数に格納します)。

+0

" woocommerce_init " – Ferex