web-dev-qa-db-fra.com

Woocommerce: détectez l'endroit où le bouton Ajouter au panier a été cliqué et exécutez un code différent

Dans la boutique en ligne:

  • Il y a des articles affichés sur la page d'accueil et chacun des articles a un bouton "Ajouter au panier" en dessous. Lorsque ce bouton est cliqué, l'article est ajouté au panier. Si ce bouton est à nouveau cliqué, la quantité de l'article qui existe déjà dans le panier est incrémentée de 1. je crois que c'est la boucle. Jusqu'ici tout va bien.

  • Sur la page Produit unique, il y a un bouton "Ajouter au panier". Lorsque ce bouton est cliqué, l'article est ajouté au panier. Il existe également une zone de texte de saisie Quantité qui peut être utilisée pour modifier la quantité. C'est bien aussi.

LE PROBLÈME:

Je dois faire la différence entre le bouton "Ajouter au panier" qui a été cliqué dans la boucle (actuellement sur la page d'accueil, mais peut également être utilisé sur d'autres pages telles que la page d'archive, etc.) et le "Ajouter au panier "sur lequel vous avez cliqué sur la page Produit unique. Sur la base de cette différenciation, voici ce que je dois faire:

  • Si le bouton "Ajouter au panier" apparaissant dans la boucle a été cliqué, saisissez le Quantité de cet article qui existe déjà dans le panier en utilisant le $cart_item_key, incrémentez-le de 1 et envoyez-le à une fonction personnalisée qui effectuera un traitement supplémentaire et enregistrera à nouveau les détails dans le panier.
  • Si vous avez cliqué sur le bouton "Ajouter au panier" apparaissant dans la page Produit unique, saisissez le Quantité de cet article qui existe déjà dans le panier en utilisant le $cart_item_key, multipliez-le par 3 et envoyez-le à une fonction personnalisée qui effectuera un traitement supplémentaire et enregistrera à nouveau les détails dans le panier.
  • Dans les deux cas ci-dessus, la quantité est modifiée, en fonction de différentes logiques et cette quantité doit être envoyée à un appel de fonction personnalisé.

CE QUE J'AI ESSAYÉ:

J'ai essayé le code suivant:

add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{

    $cart = WC()->cart->get_cart();    

    $product = wc_get_product($product_id);

    // NEED TO RUN CUSTOM CODE HERE BASED ON THE CHECKS
    if (add to cart within loop is clicked) {
        // Get existing $quantity_from_cart from cart using $cart_item_key, but how???? 
        $new_quantity = $quantity_from_cart + 1;
    }
    else if (add to cart on single product page is clicked) {
        // Get existing $quantity_from_cart from cart using $cart_item_key, but how????
        $new_quantity = $quantity_from_cart * 3;
    }
    // Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
    my_custom_function($new_quantity, $cart_item_key);
}


function my_custom_function($new_quantity, $cart_item_key)
{
    echo $new_quantity;

    WC()->cart->cart_contents[$cart_item_key]['custom_quantity'] = $new_quantity;
    WC()->cart->set_session();
}

Le problème avec le code ci-dessus est que si je n'ai pas le if... else if... logique, le code est exécuté quel que soit l'emplacement du bouton "Ajouter au panier". En d'autres termes, que je clique sur le bouton "Ajouter au panier" situé dans la boucle (page d'accueil, page d'archive ou toute page utilisant la boucle) ou que je clique sur le bouton "Ajouter au panier" situé dans la page Produit unique, le code ci-dessus est exécuté en l'absence de if... else if... logique.

Donc, je veux exécuter un code séparé lorsque le bouton "Ajouter au panier" qui se trouve dans la boucle est cliqué (quel que soit son emplacement, que ce soit la page d'accueil, les archives, etc.) et exécuter un code différent lorsque le "Ajouter au panier "qui se trouve sur la page Produit unique est cliqué. Comment puis-je y parvenir?

Attendre quelque chose comme ceci:

  • Si le bouton apparaissant à l'intérieur de la boucle est cliqué -> Faites ceci.
  • Si vous cliquez sur le bouton apparaissant dans la page Produit unique -> Faites-le.
10
Devner

vous pouvez utiliser is_product(), is_product_category() function

function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{

    $cart = WC()->cart->get_cart();    

    $product = wc_get_product($product_id);

    if ( is_product() ) {
    global $product;
    $id = $product->get_id();
    foreach ( WC()->cart->get_cart() as $cart_item ) { 
       if($cart_item['product_id'] == $id ){
           $quantity_from_cart =  $cart_item['quantity'];
           break; // stop the loop if product is found
       }
     }

        $new_quantity = $quantity_from_cart * 3;
    }
  else if (is_product_category()) {
        $new_quantity = $quantity_from_cart + 1;
    }
    my_custom_function($new_quantity, $cart_item_key);
}
1
RBT

Vous pouvez essayer de cette façon:

add_action('woocommerce_add_to_cart', 'custom_action_add_to_cart', 20, 6);
function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    $cart = WC()->cart->get_cart();
    $product = wc_get_product($product_id);
    $referer = $_SERVER['HTTP_REFERER'];
    $route = parse_url( $referer );
    $path = $route['path'] ?? 'home' ;
    $args = array_filter( ( explode('/', $path) ) );
    if (in_array( 'product', $args) ) {
        // Product Page
    } elseif (in_array('product-category', $args)) {
        // Product Category
    } else {
        // Default
    }
}

Mais vous devez vérifier vos paramètres. Settings > Permalinks.

1
Dmitry

vous pouvez utiliser wp_get_referer ou check_ajax_referer () par exemple:

function custom_action_add_to_cart($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data)
{

    $cart = WC()->cart->get_cart();    

    $product = wc_get_product($product_id);
    $referer = wp_get_referer();
    // HOMEPAGE
    if (strpos($referer ,'http://yourwebsite.com/') !== false) { 
        $new_quantity = $quantity_from_cart + 1;
    }
    //from some product page like http://yourwebsite.com/product/my-product-page
    else if (strpos($referer ,'http://yourwebsite.com/product/') !== false) {
        $new_quantity = $quantity_from_cart * 3;
    }
    // Need to send the $new_quantity along with the $cart_item_key to the custom function so that the data can be saved using $cart_item_key
    my_custom_function($new_quantity, $cart_item_key);
}

Veuillez vous référer: Fonctions liées à Wordpress Nonces

1
Ronak Dhoot

Il y a quelques solutions auxquelles je pourrais penser. Mais en voici une:

add_action( 'woocommerce_after_add_to_cart_button', 'rmg_woocommerce_after_add_to_cart_button' );
function rmg_woocommerce_after_add_to_cart_button() {
    $button_location = 0;
    // if (is_home() || is_front_page()) {
    //     // we're at the home page
    //     $button_location = 1;
    // }
    if (is_product()) {
        // where at product page
        $button_location = 2;
    } else {
        // pages other than product page
        $button_location = 1;
    }
    echo '<input type="hidden" name="button-location" value="'. $button_location .'" />';
}

Nous pourrions ajouter une entrée cachée à l'intérieur du formulaire, que le code ci-dessus le fait.
Puis pourrait vérifier sa valeur comme:

$button_location = $_REQUEST['button-location'];
if ($button_location && $button_location === 2) {
    // add to cart button clicked at or came from product page..
    $new_quantity = $quantity_from_cart + 1;
}

Veuillez noter que ce n'est qu'une idée et non une solution complète ... Vous devez prendre soin du bouton ajax.

0
Reigel