web-dev-qa-db-ja.com

「woocommerce_add_to_cart」のフィルターまたはフックを追加する方法

enter image description here

同時に2つの製品をカートに追加します。1つは元の(現在の)製品で、2つ目はドロップダウンリストからです

add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
$cnt=2
function custome_add_to_cart() {
    global $woocommerce;
      $cnt = $cnt + 1;
      echo $cnt."X";
      echo $p_id=$_POST['assessories'];
    $woocommerce->cart->add_to_cart($p_id, 1);

}

出力:-下の出力画像でわかるように、カートに同じドロップダウンアイテムを何度も追加していますが、カートに追加する数量は1つだけにしたいです。 add_to_cart関数が何度も実行されているようです。カート関数に追加するパラメーターとして2番目のドロップダウン製品を渡すフィルターを追加するにはどうすればよいですか?カートにこの商品を追加することもできます。

enter image description here

7
luckyamit

これはうまくいくはずです:

add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
function custome_add_to_cart() {
    global $woocommerce;

    $product_id = $_POST['assessories'];

    $found = false;

    //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 );
    } else {
        // if no products in cart, add it
        WC()->cart->add_to_cart( $product_id );
    }
}

次のソースに基づく: https://docs.woothemes.com/document/automatically-add-product-to-cart-on-visit/

10
alev

Woocommerceの「add_to_cart」関数は、フック「woocommerce_add_to_cart」を実行します。したがって、コード内で「add_to_cart」が実行され、「woocommerce_add_to_cart」がコードを実行し、「add_to_cart」を実行します。etceteraetcetera ...再帰ループを作成しました。

別の方法を見つけるか、独自のコードで$woocommerce->cart->add_to_cart($p_id, 1);の呼び出しを停止する必要があります。

8

あなたが探しているのは可変製品で、いくつかの属性があります!

とにかく、本当にそれをしたいのなら、remove_action関数が必要です:

_add_action('woocommerce_add_to_cart', 'custome_add_to_cart');
function custome_add_to_cart() {
    $p_id=$_POST['assessories'];
    remove_action('woocommerce_add_to_cart', __FUNCTION__);
    WC()->cart->add_to_cart( $p_id );
}
_

これにより、アクションが無限にループするのを防ぎ、非常にシンプルです。そのため、その製品に対して一度だけ追加されます。カートに追加された数量を取得し、それをWC()->cart->add_to_cart関数の2番目のパラメーターとして指定すると、両方が同じ数量になります。

___FUNCTION___は魔法のPHPタグであり、現在の機能の名前を文字列として提供します。si関数名が同じでない場合でも機能します

0
Tofandel