1
votes

Événement délégué WooCommerce added_to_cart dans des pages de produit uniques

Dans Woocommerce, lorsque je clique sur le bouton Ajouter au panier dans des pages de produits uniques, le produit est ajouté au panier avec succès. Désormais, une fois le produit ajouté au panier (après le rechargement de la page), je voudrais déclencher l'affichage des boutons CHECKOUT et VOIR PANIER .

Le Le code suivant fonctionne bien sur AJAX AJOUTER AU PANIER mais pas pour AJOUTER UNIQUE AU PANIER car il n'est pas activé pour Ajax:

$( document.body ).on( 'added_to_cart', function(){
    console.log('added_to_cart');
}); 

Comment pourrais-je le faire fonctionner pour des AJOUTER UNIQUE AU PANIER ?

Ajax ajouter au panier (work) : https://test.sushi2500.dk/takeaway/nigiri-laks/ Ajout unique au panier (ne fonctionne pas) : https://test.sushi2500.dk/takeaway/maanedstilbud/


0 commentaires

3 Réponses :


0
votes
$( document.body ).on( '.wc-variation-selection-needed', function(){

      console.log('added_to_cart');

}); 
Try this

4 commentaires

Ceci est juste un console.log. Comment cela devrait-il résoudre le problème lol?


@ Mr.Jo Triggering ne fonctionne pas, c'est le problème, non? :)


Oui, vous pouvez vérifier les deux liens, puis vous comprenez plus clairement


@Viveksaroch Les deux ne se connectent pas à Google Chrome :)



2
votes

Mise à jour de novembre 2020

  • Vérifiez les articles du panier pour vous assurer que le produit a été ajouté au panier .
  • Gérer davantage de données produit, de variantes de produits et de leurs attributs .

Sur une seule page de produit, car les données sont soumises sur un formulaire en utilisant la méthode "post" (aucun JS / AJAX impliqué) , donc vous pouvez détecter l'événement "ajouté au panier" en utilisant les variables PHP $_POST , de cette façon:

add_action('wp_footer', 'single_added_to_cart_event');
function single_added_to_cart_event()
{
    if( isset($_POST['add-to-cart']) && isset($_POST['quantity']) ) :

    // Get added to cart product ID (or variation ID) and quantity (if needed)
    $id_to_check   = isset($_POST['variation_id']) ? esc_attr($_POST['variation_id']) : esc_attr($_POST['add-to-cart']);
    $product_id   = isset($_POST['variation_id']) ? esc_attr($_POST['variation_id']) : esc_attr($_POST['add-to-cart']);
    $variation_id  = isset($_POST['variation_id']) ? esc_attr($_POST['variation_id']) : 0;
    $quantity      = esc_attr($_POST['quantity']);
    $found_in_cart = false; // Initializing

    // Check cart items to be sure that the product has been added to cart (and get product data)
    foreach( WC()->cart->get_cart() as $item ) {
        $product = $item['data']; // The WC_Product Object
        if( $product->get_id() == $id_to_check ) {
            $product_name = $product->get_name(); // Product name
            $sku          = $product->get_sku(); // Product sku
            $type         = $product->get_type(); // Product sku
            $price        = wc_get_price_to_display($product); // Product price for display
            $stock_qty    = $product->get_stock_quantity(); // Product sku
            $stock_status = $product->get_stock_status(); // Product sku
            $attributes   = $variation_id > 0 ? json_encode($product->get_attributes()) : "''";

            $found_in_cart = true;
            break; // Stop the loop
        }
    }


    if( $found_in_cart ) :

    // The displayed message (example)
    if ( $variation_id > 0 ) {
        $message = sprintf( __('Product "%s" has been added to cart. \r\nProduct type: %s \r\nProduct price: %s \r\nProduct_id: %s \r\nVariation_id: %s \r\nQuantity: %s'),
            $product_name, $type, $price, $product_id, $variation_id, $quantity );
    } else {
        $message = sprintf( __('Product "%s" has been added to cart. \r\nProduct type: %s \r\nProduct price: %s \r\nProduct_id: %s \r\nQuantity: %s'),
            $product_name, $type, $price, $product_id, $quantity );
    }

    // JS code goes here below
    ?>
    <script>
    jQuery(function($){
        // All product data
        var product_id   = <?php echo esc_attr($_POST['add-to-cart']); ?>,
            variation_id = <?php echo $variation_id; ?>,
            quantity     = <?php echo $quantity; ?>,
            attributes   = <?php echo $attributes; ?>,
            name         = '<?php echo $product_name; ?>',
            type         = '<?php echo $type; ?>',
            sku          = '<?php echo $sku; ?>',
            price        = '<?php echo $price; ?>',
            stock_qty    = '<?php echo $stock_qty; ?>',
            stock_status = '<?php echo $stock_status; ?>',
            message      = '<?php echo $message; ?>';

        console.log(message);
        if ( variation_id > 0 ) console.log(attributes);

        alert(message);
    });
    </script>
    <?php
    endif; endif;
}

Le code entre en fonction Fichier .php de votre thème enfant actif (ou thème actif).

Testé et fonctionne pour des pages de produit uniques (ou si vous utilisez [product_page id = "99"] shortcode comme) .

 entrez la description de l'image ici

Vous pouvez utiliser le code sur un modèle, sur une fonction personnalisée (ou dans un shortcode personnalisé) .


5 commentaires

où dois-je ajouter ce code. lorsque j'ajoute ces extraits à function.php, cela provoque une erreur 403 interdite.


Le problème avec cette approche est qu'elle va déclencher l'événement added_to_cart même si le produit n'est pas validé sur woocommerce_add_to_cart_validation


@PabloSGPacheco J'ai mis à jour mon code pour gérer le hook woocommerce_add_to_cart_validation lorsqu'un produit n'est pas validé ou n'est pas ajouté au panier pour d'autres raisons… Comme vous le verrez, maintenant je vérifie les articles du panier pour être sûr que le produit est ajouté au panier. Maintenant, votre réponse de code ne répond pas vraiment à la question OP car le déclenchement de l'événement Ajax "added_to_cart" donnera un événement avec des paramètres de produit vides ... N'oubliez pas que l'événement "added_to_cart" est pour Ajax ajouter au panier et cet événement permet d’obtenir des paramètres produit qui seront vides lors du déclenchement comme vous le faites…


Super @LoicTheAztec, merci pour la mise à jour. Concernant mon code, vous avez raison. Il n'a pas de paramètres de produit pour le moment, mais je pense que je pourrais le faire en récupérant les paramètres de produit à partir du crochet woocommerce_add_to_cart


@PabloSGPacheco Désolé mais votre code de réponse ne gère toujours pas les variations de produits ajoutés au panier car il ne donne pas l'ID de la variante et les attributs associés ... Comme je l'ai déjà dit, l'événement "added_to_cart" est juste pour Ajax ajouter au panier et simple produits, mais pas tous les autres types de produits qui nécessitent un ajout normal au panier sur une seule page de produit.



0
votes

Avec cette approche, je pense que vous serez en mesure de déclencher l'événement added_to_cart sur des pages uniques, évitant ainsi le problème de le déclencher involontairement si le produit n'a pas été ajouté au panier au cas où il n'a pas été validé sur le filtre woocommerce_add_to_cart_validation par exemple.

Vous pouvez transmettre tout autre argument à l'événement à partir du hook woocommerce_add_to_cart , comme l'ID du produit, la quantité, la variation id, etc.

Si l'événement added_to_cart ne vous convient pas, vous pouvez déclencher votre propre événement personnalisé si vous le souhaitez.

add_action( 'woocommerce_add_to_cart', 'trigger_single_added_to_cart_event', 10, 6 );
function trigger_added_to_cart_event_in_single_product_page() {
    $params = func_get_args();
    add_action( 'wp_footer', function () use( $params ) {
        ?>
        <script>
            jQuery(function ($) {
                $(document.body).trigger({
                    type: 'added_to_cart',
                    product_id:<?php echo esc_attr( $params[1] ) ?>,
                    quantity:<?php echo esc_attr( $params[2] ) ?>
                });
            }); 
        </script>
        <?php
    } );
}


3 commentaires

L'événement "added_to_cart" est juste pour Ajax ajouter au panier, donc pas pour les pages de produits uniques! Ainsi, le "added_to_cart" déclenché par votre code sera vide, aucun identifiant de produit n'est défini (pas de données liées)…


Merci @LoicTheAztec, je crois qu'il ne sera plus vide


Cela ne fonctionnera pas lors de l'ajout de variantes de produit au panier, car l'événement "added_to_cart" ne gère pas les variantes de produit et leurs attributs…