Woocommerce: Sprawdź, gdzie kliknięto przycisk Dodaj do koszyka i uruchom inny kod

10

W sklepie e-commerce:

  • Na stronie głównej są wyświetlane elementy, a pod każdym z nich znajduje się przycisk „Dodaj do koszyka”. Po kliknięciu tego przycisku element jest dodawany do koszyka. Jeśli ten przycisk zostanie kliknięty ponownie, Ilość przedmiotu, który już istnieje w koszyku, zwiększa się o 1. Myślę, że to jest pętla . Na razie w porządku.

  • Na stronie pojedynczego produktu znajduje się przycisk „Dodaj do koszyka”. Po kliknięciu tego przycisku przedmiot zostaje dodany do koszyka. Istnieje również pole tekstowe Ilość, które można wykorzystać do zmiany ilości. To też jest w porządku.

PROBLEM:

Muszę rozróżnić przycisk „Dodaj do koszyka”, który został kliknięty w pętli (obecnie na stronie głównej, ale może być również używany na innych stronach, takich jak strona Archiwum itp.), A przyciskiem „Dodaj do koszyka”, który został kliknięty na stronie pojedynczego produktu. W oparciu o to zróżnicowanie, oto co muszę zrobić:

  • Jeśli kliknięty został przycisk „Dodaj do koszyka” pojawiający się w pętli, weź Ilość tego produktu, który już istnieje w koszyku, używając $cart_item_key, zwiększ go o 1 i wyślij go do funkcji niestandardowej, która wykona dodatkowe przetwarzanie i zapisze szczegóły do koszyka ponownie.
  • Jeśli kliknięty został przycisk „Dodaj do koszyka” pojawiający się na stronie Pojedynczy produkt, weź Ilość tego produktu, który już istnieje w koszyku za pomocą $cart_item_key, pomnóż go przez 3 i wyślij go do funkcji niestandardowej, która wykona dodatkowe przetwarzanie i zapisze szczegóły do ​​koszyka ponownie.
  • W obu powyższych przypadkach ilość jest zmieniana w oparciu o różne logiki i ta ilość musi zostać wysłana do wywołania funkcji niestandardowej.

CO SPRÓBOWAŁEM:

Próbowałem następującego kodu:

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

Problem z powyższym kodem polega na tym, że jeśli nie mam if... else if...logiki, kod jest wykonywany niezależnie od tego, gdzie znajduje się przycisk „Dodaj do koszyka”. Innymi słowy, czy kliknę przycisk „Dodaj do koszyka” znajdujący się w pętli (strona główna, strona Archiwum lub dowolna strona korzystająca z pętli), czy kliknę przycisk „Dodaj do koszyka” znajdujący się na stronie pojedynczego produktu, powyższy kod jest wykonywany przy braku if... else if...logiki.

Chcę uruchomić osobny kod po kliknięciu przycisku „Dodaj do koszyka” znajdującego się w pętli (niezależnie od jego lokalizacji, strony głównej, archiwów itp.) I uruchomić inny kod po naciśnięciu przycisku „Dodaj do koszyka” , który znajduje się na stronie Pojedynczy produkt, zostaje kliknięty. Jak mogę to osiągnąć?

Oczekiwanie czegoś takiego:

  • Jeśli kliknięty zostanie przycisk pojawiający się w pętli -> Zrób to.
  • Jeśli kliknięty zostanie przycisk pojawiający się na stronie Pojedynczy produkt -> Zrób to.
Devner
źródło

Odpowiedzi:

1

możesz użyć wp_get_referer lub check_ajax_referer () na przykład:

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

Zobacz: Funkcje związane z Wordpress Nonces

Ronak Dhoot
źródło
Ręczne sprawdzanie strony głównej, strony produktu itp. To przesada. Staram się nie kodować nazw stron i raczej WP obsługuje je wewnętrznie.
Devner
1

Możesz spróbować w ten sposób:

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

Ale musisz sprawdzić swoje ustawienia. Settings > Permalinks.

Dmitry
źródło
Ręczne sprawdzanie strony głównej, strony produktu itp. To przesada. Staram się nie kodować nazw stron i raczej WP obsługuje je wewnętrznie.
Devner
1

możesz użyć is_product(), is_product_category()funkcji

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
źródło
Zmęczyłem twoje rozwiązanie. Gdy jestem na stronie Pojedynczego produktu i dodałem produkt do koszyka, spodziewałem się, że kod $new_quantity = $quantity_from_cart * 3;zadziała. Ale tak nie jest. Po prostu zwiększa obecną ilość w koszyku, ale NIE mnoży ilości przez 3 . Jak to naprawić?
Devner
Spróbuj teraz pomnoży ilość przez 3
RBT
Właśnie wypróbowałem twoje poprawione rozwiązanie. Ale jakoś wynik jest taki sam jak mój poprzedni komentarz. Wydaje się, że z jakiegoś powodu dziwnej, kod if ( is_product() )jest nie wykonywane. Nie mogę znaleźć przyczyny, dla której! Czy to ważne, że jest to przycisk Dodaj do koszyka AJAX?
Devner
0

Mogę wymyślić kilka rozwiązań. Ale oto jeden:

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 .'" />';
}

Możemy dodać ukryte dane wejściowe w formularzu, że robi to powyższy kod.
Następnie może sprawdzić jego wartość jak:

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

Pamiętaj, że to tylko pomysł, a nie kompletne rozwiązanie ... Musisz zająć się przyciskiem ajax.

Reigel
źródło
Wydaje się, że z jakiegoś dziwnego powodu kod, jeśli (is_product ()) NIE jest wykonywany. Nie mogę znaleźć przyczyny, dla której! Czy to ważne, że jest to przycisk Dodaj do koszyka AJAX?
Devner
z $button_location
ajaxem