Woocommerce: détecter où le bouton Ajouter au panier a été cliqué et exécuter un code différent

10

Dans la boutique en ligne:

  • Il y a des articles affichés sur la page d'accueil et chacun d'eux a un bouton "Ajouter au panier" en dessous d'eux. Lorsque ce bouton est cliqué, l'article est ajouté au panier. Si ce bouton est cliqué à nouveau, la quantité de l'article qui existe déjà dans le panier est incrémentée de 1. Je pense 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 de 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'archives, etc.) et le bouton "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 la quantité de cet article qui existe déjà dans le panier à l'aide de $cart_item_key, augmentez-la de 1 et envoyez-la à une fonction personnalisée qui effectuera un traitement supplémentaire et enregistrera les détails. au panier à nouveau.
  • Si le bouton "Ajouter au panier" apparaissant sur la page Produit unique a été cliqué, saisissez la quantité de cet article qui existe déjà dans le panier à l'aide de $cart_item_key, multipliez-la par 3 et envoyez-la à une fonction personnalisée qui effectuera un traitement supplémentaire et économisera les détails au panier à nouveau.
  • Dans les deux cas ci-dessus, la quantité est modifiée en fonction de logiques différentes 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 la if... else if...logique, le code est exécuté indépendamment de 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é sur la page du produit unique, le code ci-dessus est exécuté en l'absence de laif... else if... logique.

Donc, je veux exécuter un code distinct lorsque le bouton "Ajouter au panier" situé 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 bouton "Ajouter au panier" qui se trouve sur la page Produit unique est cliqué. Comment puis-je atteindre cet objectif?

Attendre quelque chose comme ça:

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

Réponses:

1

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 consulter: Fonctions liées à Wordpress Nonces

Ronak Dhoot
la source
Les vérifications manuelles de la page d'accueil, de la page produit, etc. sont une exagération. J'essaie de ne pas coder en dur les noms de page et plutôt de laisser WP le gérer en interne.
Devner
1

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.

Dmitry
la source
Les vérifications manuelles de la page d'accueil, de la page produit, etc. sont une exagération. J'essaie de ne pas coder en dur les noms de page et plutôt de laisser WP le gérer en interne.
Devner
1

vous pouvez utiliser is_product(), is_product_category()fonctionner

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);
}
RBT
la source
J'ai fatigué ta solution. Lorsque je suis sur la page Produit unique et que j'ai ajouté le produit au panier, je m'attendais à ce que le code $new_quantity = $quantity_from_cart * 3;fonctionne. Mais ce n'est pas le cas. Il incrémente simplement la quantité existante dans le panier, mais ne multiplie PAS la quantité par 3 . Comment régler ceci?
Devner
Essayez maintenant, il multipliera la quantité par 3
RBT
Je viens d'essayer votre solution révisée. Mais en quelque sorte, le résultat est le même que mon commentaire précédent. Il semble que pour une raison étrange, le code if ( is_product() )n'est PAS en cours d'exécution. Je n'arrive pas à trouver la raison! Est-il important que ce soit un bouton AJAX Ajouter au panier ??
Devner
0

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

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, le code ci-dessus le fait.
Ensuite, 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.

Reigel
la source
Il semble que pour une raison étrange, le code if (is_product ()) n'est PAS en cours d'exécution. Je n'arrive pas à trouver la raison! Est-il important que ce soit un bouton AJAX Ajouter au panier ??
Devner le
avec ajax, vous devez passer la valeur de $button_locationdans la demande ..
Reigel