Woocommerce: Mendeteksi di mana tombol Add to Cart diklik dan menjalankan kode yang berbeda

10

Di toko e-niaga:

  • Ada item yang ditampilkan di Beranda dan masing-masing item memiliki tombol "Tambahkan ke Troli" di bawahnya. Ketika tombol ini diklik, item ditambahkan ke troli. Jika tombol ini diklik lagi, Kuantitas item yang sudah ada di troli, bertambah 1. Saya yakin ini adalah loop . Sejauh ini bagus.

  • Pada halaman Produk Tunggal, ada tombol "Tambahkan ke Troli". Ketika tombol ini diklik, item tersebut akan ditambahkan ke troli. Ada juga kotak teks input Kuantitas yang dapat digunakan untuk mengubah kuantitas. Ini juga baik-baik saja.

MASALAH:

Saya perlu membedakan antara tombol "Tambahkan ke Troli" yang diklik dalam loop (saat ini di Beranda, tetapi juga dapat digunakan pada halaman lain seperti halaman Arsip, dll.) Vs tombol "Tambahkan ke Troli" yang diklik pada halaman Produk Tunggal. Berdasarkan perbedaan ini, inilah yang perlu saya lakukan:

  • Jika tombol "Tambahkan ke Troli" yang muncul dalam loop diklik, ambil Jumlah item ini yang sudah ada di troli menggunakan $cart_item_key, tambahkan 1, dan kirim ke fungsi kustom yang akan melakukan pemrosesan tambahan dan menyimpan detailnya ke troli lagi.
  • Jika tombol "Tambahkan ke Troli" muncul di halaman Produk Tunggal diklik, ambil Jumlah item ini yang sudah ada di troli menggunakan $cart_item_key, gandakan dengan 3 dan kirim ke fungsi kustom yang akan melakukan pemrosesan tambahan dan menyimpan detail ke troli lagi.
  • Dalam kedua kasus di atas, Kuantitas sedang diubah, berdasarkan berbagai logika dan Kuantitas ini perlu dikirim ke pemanggilan fungsi kustom.

APA YANG SAYA MENCOBA:

Saya mencoba kode berikut:

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

Masalah dengan kode di atas adalah bahwa jika saya tidak memiliki if... else if...logika, maka kode dijalankan tanpa memperhatikan di mana tombol "Add to Cart" berada. Dengan kata lain, apakah saya mengklik tombol "Tambahkan ke Troli" yang terletak di loop (Beranda, Arsip halaman atau halaman apa pun yang menggunakan loop) atau saya klik tombol "Tambahkan ke Troli" yang terletak di halaman Produk Tunggal, kode di atas dijalankan tanpa adanya if... else if...logika.

Jadi, saya ingin menjalankan kode terpisah ketika tombol "Tambahkan ke Troli" yang terletak di loop diklik (terlepas dari lokasinya, apakah Beranda, Arsip, dll.) Dan menjalankan kode yang berbeda ketika tombol "Tambahkan ke Troli" yang terletak pada halaman Produk Tunggal diklik. Bagaimana saya bisa mencapai ini?

Mengharapkan sesuatu seperti ini:

  • Jika tombol yang muncul di dalam loop diklik -> Lakukan ini.
  • Jika tombol yang muncul di halaman Produk Tunggal diklik -> Lakukan itu.
Devner
sumber

Jawaban:

1

Anda dapat menggunakan wp_get_referer atau check_ajax_referer () misalnya:

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

Silakan merujuk: fungsi terkait Wordpress Nonces

Ronak Dhoot
sumber
Pemeriksaan manual untuk Homepage, halaman Produk, dll. Adalah pembunuhan berlebihan. Saya mencoba untuk tidak membuat kode nama halaman dan lebih suka WP menanganinya secara internal.
Devner
1

Anda dapat mencoba cara ini:

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

Tetapi Anda perlu memeriksa pengaturan Anda. Settings > Permalinks.

Dmitry
sumber
Pemeriksaan manual untuk Homepage, halaman Produk, dll. Adalah pembunuhan berlebihan. Saya mencoba untuk tidak membuat kode nama halaman dan lebih suka WP menanganinya secara internal.
Devner
1

Anda dapat menggunakan is_product(), is_product_category()berfungsi

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
sumber
Saya lelah solusi Anda. Ketika saya berada di halaman Produk Tunggal dan menambahkan produk ke troli, saya berharap kode tersebut $new_quantity = $quantity_from_cart * 3;berfungsi. Tapi ternyata tidak. Ini hanya menambah jumlah yang ada saat ini dalam keranjang, tetapi TIDAK mengalikan kuantitas dengan 3 . Bagaimana cara memperbaikinya?
Devner
Coba Sekarang ini akan melipatgandakan kuantitas dengan 3
RBT
Saya baru saja mencoba solusi revisi Anda. Tapi entah bagaimana, hasilnya sama dengan komentar saya sebelumnya. Sepertinya karena alasan yang aneh, kode if ( is_product() )ini TIDAK dijalankan. Sepertinya saya tidak dapat menemukan alasannya! Apakah penting bahwa itu adalah tombol Add to Cart AJAX ??
Devner
0

Ada beberapa solusi yang bisa saya pikirkan. Tapi ini satu:

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

Kita dapat menambahkan input tersembunyi di dalam formulir, bahwa kode di atas melakukannya.
Kemudian dapat memeriksa nilainya seperti:

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

Harap dicatat bahwa ini hanyalah sebuah gagasan dan bukan solusi lengkap ... Anda harus menjaga tombol ajax.

Reigel
sumber
Sepertinya karena alasan yang aneh, kode if (is_product ()) TIDAK dijalankan. Sepertinya saya tidak dapat menemukan alasannya! Apakah penting bahwa itu adalah tombol Add to Cart AJAX ??
Devner
dengan ajax, Anda harus memberikan nilai $button_locationdalam permintaan ..
Reigel