Woocommerce: Sepete Ekle düğmesinin nerede tıklandığını tespit edin ve farklı kod çalıştırın


10

E-ticaret mağazasında:

  • Ana sayfada görüntülenen öğeler var ve her öğenin altında bir "Sepete Ekle" düğmesi var. Bu düğmeye tıklandığında, ürün sepete eklenir. Bu düğmeye tekrar tıklanırsa, halihazırda alışveriş sepetinde bulunan öğenin miktarı 1 artar. Bunun döngü olduğunu düşünüyorum . Çok uzak çok iyi.

  • Tek Ürün sayfasında bir "Sepete Ekle" düğmesi vardır. Bu düğme tıklandığında, öğe sepete eklenir. Miktarı değiştirmek için kullanılabilecek bir Miktar girişi metin kutusu da vardır. Bu da iyi.

SORUN:

Döngü içinde tıklanan "Sepete Ekle" düğmesi (şu anda Ana Sayfa'da, ancak Arşiv sayfası vb. Gibi diğer sayfalarda da kullanılabilir) ile "Tıklanan Sepete Ekle" düğmesi arasında ayrım yapmam gerekiyor Tek Ürün sayfasında. Bu farklılaşmaya dayanarak, yapmam gereken şey:

  • Döngü içinde görünen "Sepete Ekle" düğmesi tıklanmışsa, sepeti kullanarak zaten mevcut olan bu öğenin Miktarını , $cart_item_key1 ile artırın ve bunu ek işlem yapacak ve ayrıntıları kaydedecek özel bir işleve gönderin tekrar sepete.
  • Tek Ürün sayfasında görünen "Sepete Ekle" düğmesi tıklanmışsa, ürün sepetinde zaten mevcut olan bu öğenin Miktarını$cart_item_key 3 ile çarpın ve bunu ek işleme ve kaydetme yapacak özel bir işleve gönderin Ayrıntılar tekrar alışveriş sepetine.
  • Yukarıdaki her iki durumda da, Miktar, farklı mantıklara göre değiştirilir ve bu Miktarın özel bir işlev çağrısına gönderilmesi gerekir.

NELER YAPTIK:

Aşağıdaki kodu denedim:

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

Yukarıdaki kod ile sorun if... else if...mantığı yoksa , o zaman kod "sepete ekle" düğmesinin nerede olursa olsun yürütülür olmasıdır. Başka bir deyişle, döngüde bulunan "Sepete Ekle" düğmesini (Ana Sayfa, Arşiv sayfası veya döngüyü kullanan herhangi bir sayfa) tıklasam, yoksa Tek Ürün sayfasında bulunan "Sepete Ekle" düğmesini tıklasam da, yukarıdaki kod if... else if...mantık yokluğunda yürütülür .

Bu nedenle, döngüde yer alan "Sepete Ekle" düğmesi tıklatıldığında ayrı bir kod çalıştırmak istiyorum (konumu, Ana Sayfa, Arşivler, vb. Olsun bağımsız olarak) ve "Sepete Ekle" düğmesi Tek Ürün sayfasında bulunan tıklanır. Bunu nasıl başarabilirim?

Böyle bir şey bekliyorum:

  • Döngünün içinde görünen düğme tıklanırsa -> Bunu yapın.
  • Tek Ürün sayfasında görünen düğme tıklanırsa -> Bunu yapın.

Yanıtlar:


1

Kullanabileceğiniz wp_get_referer veya check_ajax_referer () örneğin:

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

Lütfen bakınız: Wordpress Nonces ile ilgili fonksiyonlar


Ana Sayfa, Ürün sayfası, vb. İçin manuel kontroller gereğinden fazladır. Sayfa adlarını sabit kodlamak yerine WP dahili olarak işlemek için çalışıyorum.
Devner

1

Bu şekilde deneyebilirsiniz:

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

Ancak ayarlarınızı kontrol etmeniz gerekir. Settings > Permalinks.


Ana Sayfa, Ürün sayfası, vb. İçin manuel kontroller gereğinden fazladır. Sayfa adlarını sabit kodlamak yerine WP dahili olarak işlemek için çalışıyorum.
Devner

1

kullanabilirsiniz is_product(), is_product_category()fonksiyon

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

Çözümünüzü yordum. Tek Ürün sayfasındayken ürünü sepete eklediğimde, kodun $new_quantity = $quantity_from_cart * 3;çalışmasını bekledim . Ama öyle değil. Bu sadece sepetinde akım mevcut miktarını artırır, ancak does DEĞİL tarafından çarpın miktarı 3 . Bunu nasıl düzeltirim?
Devner

Şimdi Dene Miktarı 3 ile çarpacak
RBT

Düzeltilmiş çözümünüzü denedim. Ama bir şekilde, sonuç önceki yorumumla aynı. Bazı garip nedenle, kod böyle görünüyor if ( is_product() )edilir DEĞİL yürütülmektedir. Nedenini bulamıyorum! AJAX Sepete Ekle düğmesi olması önemli mi ??
Devner

0

Aklıma gelen birkaç çözüm var. Ama burada bir tane var:

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

Formun içine gizli bir girdi ekleyebiliriz, yukarıdaki kod bunu yapar.
Sonra onun değerini kontrol edebilirsiniz:

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

Lütfen bunun sadece bir fikir olduğunu ve eksiksiz bir çözüm olmadığını unutmayın ... ajax düğmesine dikkat etmeniz gerekir.


Bazı garip nedenle, kod if (is_product ()) olduğunu gibi görünüyor DEĞİL yürütülmektedir. Nedenini bulamıyorum! AJAX Sepete Ekle düğmesi olması önemli mi ??
Devner

ajax ile, $button_locationisteğin değerini geçmeniz gerekir ..
Reigel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.