2016-12-14 13 views
2

を追加する前に、製品IDの株式を確認してくださいWooCommerce。は、ユーザーのカートに製品を追加し、私のWooCommerceサイトで、私はいくつかのカスタムコードを持って

私は働くことができない...私はすでにそれが最初のカート内の他の製品があることを確認するカートの中身を確認していますが、私はまた、それが追加されている製品も在庫があることを確認したいですこれを行う最善の方法を外してください。

add_action('template_redirect', 'add_product_to_cart'); 
function add_product_to_cart() { 
    if (! is_admin()) { 
     $product_id = 21576; 
     $found = false; 
     global $woocommerce; 

     //check if product already in cart 

    if (sizeof(WC()->cart->get_cart()) > 0) { 
     foreach (WC()->cart->get_cart() as $cart_item_key => $values) { 
      $_product = $values['data']; 
      if ($_product->id == $product_id) 
       $found = true; 
     } 
     // if product not found, add it 
     if (! $found) 
      WC()->cart->add_to_cart($product_id); 

     if (sizeof(WC()->cart->get_cart()) == 1 && $found == true) { 
      $woocommerce->cart->empty_cart(); 
     } 
    } 
} 

}

答えて

3

You can use the WC_Product conditional methodis_in_stock() directly in your if statement.

As $product is already a product object, we don't need anything else to make it work with WC_product methods .

代わりにあなたがWC_cart方法is_empty()このよう! WC()->cart->is_empty()によって置き換えることができますsizeof(WC()->cart->get_cart()) > 0を使用します。

次に、あなたもこの方法WC()->cart->get_cart_contents_count() == 1 WC_cart get_cart_contents_count()方法を使用してsizeof(WC()->cart->get_cart()) == 1を置き換えることができます。

あなたは

Last thing:
May be is better to remove the concerned cart item, instead emptying the cart. So we will use remove_cart_item() method instead.
If is not convenient you can use empty_cart() method as in your original code…

all WC_Cart methodsは、だからあなたのコードがあることを行っているとWC()->cart代わりの$woocommerce->cartを使用する場合は、もうglobal woocommerce;宣言は必要ありません。

add_action('template_redirect', 'add_product_to_cart'); 
function add_product_to_cart() { 
    if (! is_admin()) { 
     $targeted_product_id = 21576; 
     $found = false; 

     //check if product already in cart 

     if (! WC()->cart->is_empty()) { 
      foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { 
       $product = $cart_item['data']; 
       if ($product->id == $targeted_product_id) { 
        $found = true; 
        break; // We can break the loop 
       } 
      } 
      // Update HERE (we generate a new product object $_product) 
      $_product = wc_get_product($targeted_product_id); 
      // If product is not in the cart items AND IS IN STOCK <=== <=== @@@@@@@ 
      if (!$found && $_product->is_in_stock()) { 
       WC()->cart->add_to_cart($targeted_product_id); 
      } elseif ($found && WC()->cart->get_cart_contents_count() == 1) { 
       // Removing only this cart item 
       WC()->cart->remove_cart_item($cart_item_key); 
       // WC()->cart->empty_cart(); 
      } 
     } 
    } 
} 

このコードはテスト済みであり、動作します。

アクティブな子テーマ(またはテーマ)のfunction.phpファイルにコードが入ります。また、任意のプラグインのPHPファイルにもあります。コメントを

+0

これはまだエラーをスローします...致命的なエラー:/nas/content/staging/tulaforlife/wp-content/plugins/tula/index.php上で非オブジェクトのメンバ関数is_in_stock()の呼び出し。これを維持するためのライン135 – user2115227

+0

おかげで、私は変数がWCで誤っている気づい() - > cart-> add_to_cart($のPRODUCT_ID);($ targeted_product_idをする必要があります)。これを変更した場合、新しいコードでは機能しますが、在庫レベルが0であっても商品を追加しようとしますが、商品が在庫切れのためカートに追加できないというメッセージが表示されます:( – user2115227

+0

ありがとう:)まだ動作しません。在庫がない場合は製品を追加し、まだ製品を追加しようとすると、製品が在庫切れであるというメッセージが表示され、追加できません。これは私が避けようとしているものです。在庫切れの場合、それを追加しようとしません。 :/ – user2115227

1

この:あなたは私はそれが「product_idの」の在庫確認にする機能に追加するかを知らせることができた場合、株式は> 0であればここに私のコードです本当に感謝商品の在庫数が0より大きい場合、trueが返されます。

if($product->get_stock_quantity() > 0) { 
    WC()->cart->add_to_cart($product->id); 
} 

私は自分で製品IDを設定しています。製品によって製品を入手する必要がある場合は、上記のコードを実行するために、これが役に立ちます。また

$product = wc_get_product($product_id); 
+0

感謝。私は上記のコードを試してみましたが、次のエラーが発生します。 致命的なエラー:未定義のメソッドWP_Post :: get_stock_quantityに呼び出し() – user2115227

+0

'get_stock_quantityは()'実際WC_Productクラスで定義されています。私は自分の答えを編集しました。最後の行を見てください。 –

+0

これによりエラーは表示されなくなりましたが、現在は製品がまったく追加されません。 :( – user2115227

関連する問題