web-dev-qa-db-fra.com

Ajouter un filtre ou un crochet pour "woocommerce_add_to_cart"

enter image description here

Je veux ajouter au panier deux produits en même temps, l'un est le produit original (en cours) et le deuxième est issu de la liste déroulante

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

}

Sortie: - Comme vous pouvez le voir dans l'image de sortie ci-dessous, il ajoute le même élément déroulant plusieurs fois dans le panier, mais je ne souhaite ajouter qu'une seule quantité au panier. il semble que la fonction add_to_cart s'exécute plusieurs fois. Que dois-je faire ou comment ajouter un filtre avec le deuxième produit déroulant comme paramètre à ajouter à la fonction panier? afin que je puisse ajouter ce produit également dans le panier.

enter image description here

5
luckyamit

Cela devrait fonctionner: 

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

Basé sur la source suivante: https://docs.woothemes.com/document/automatically-add-product-to-cart-on-visit/

8
alev

Les fonctions woocommerce "add_to_cart" exécutent le hook "woocommerce_add_to_cart". Ainsi, dans votre code "add_to_cart" est exécuté, ce qui exécute "woocommerce_add_to_cart" qui exécute votre code, qui exécute "add_to_cart", etc., etc. Vous avez créé une boucle récursive.

Vous devez trouver un autre moyen ou arrêter d'appeler $woocommerce->cart->add_to_cart($p_id, 1); dans votre propre code.

7
Niels van Renselaar

Ce que vous recherchez peut-être est un produit variable avec certains attributs!

Quoi qu'il en soit, si vous voulez vraiment faire cela, alors vous avez juste besoin de la fonction 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 );
}

Cela empêche l’action de boucler indéfiniment et est assez simple. Elle ne sera donc ajoutée qu’une fois pour ce produit. Vous voudrez peut-être obtenir la quantité ajoutée au panier et la définir en tant que second paramètre de la fonction WC()->cart->add_to_cart afin qu’elles soient toutes les deux identiques.

Le __FUNCTION__ est une balise magique PHP qui vous donne simplement le nom de la fonction actuelle sous forme de chaîne. Si le nom de la fonction n’est pas le même, il fonctionnera quand même.

0
Tofandel