Thương mại điện tử: Phát hiện nơi nút Thêm vào giỏ hàng được nhấp và chạy mã khác


10

Trong cửa hàng thương mại điện tử:

  • Có các mục được hiển thị trên Trang chủ và mỗi mục có nút "Thêm vào giỏ hàng" bên dưới chúng. Khi nhấp vào nút này, mục này sẽ được thêm vào giỏ hàng. Nếu nút này được bấm lại, Số lượng của mặt hàng đã tồn tại trong giỏ hàng, được tăng thêm 1. Tôi tin rằng đây là vòng lặp . Càng xa càng tốt.

  • Trên trang Một sản phẩm, có nút "Thêm vào giỏ hàng". Khi nhấp vào nút này, mục sẽ được thêm vào giỏ hàng. Cũng có một hộp văn bản đầu vào Số lượng có thể được sử dụng để thay đổi số lượng. Điều này cũng tốt

VẤN ĐỀ:

Tôi cần phân biệt giữa nút "Thêm vào giỏ hàng" đã được nhấp trong vòng lặp (hiện tại trên Trang chủ, nhưng cũng có thể được sử dụng trên các trang khác như trang Lưu trữ, v.v.) so với nút "Thêm vào giỏ hàng" đã được nhấp trên trang Sản phẩm duy nhất. Dựa trên sự khác biệt này, đây là những gì tôi cần làm:

  • Nếu nút "Thêm vào giỏ hàng" xuất hiện trong vòng lặp đã được nhấp, hãy lấy Số lượng của mặt hàng này đã tồn tại trong giỏ hàng bằng cách sử dụng $cart_item_key, tăng nó lên 1 và gửi nó đến một chức năng tùy chỉnh sẽ xử lý bổ sung và lưu chi tiết để giỏ hàng một lần nữa.
  • Nếu nút "Thêm vào giỏ hàng" xuất hiện trong trang Sản phẩm đơn lẻ đã được nhấp, hãy lấy Số lượng của mặt hàng này đã có trong giỏ hàng bằng cách sử dụng $cart_item_key, nhân nó với 3 và gửi nó đến một chức năng tùy chỉnh sẽ xử lý bổ sung và lưu các chi tiết để giỏ hàng một lần nữa.
  • Trong cả hai trường hợp trên, Số lượng đang được thay đổi, dựa trên các logic khác nhau và Số lượng này cần được gửi đến một cuộc gọi chức năng tùy chỉnh.

Tôi đã nói gì

Tôi đã thử đoạn mã sau:

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

Vấn đề với mã ở trên là nếu tôi không có if... else if...logic, thì mã được thực thi bất kể vị trí của nút "Thêm vào giỏ hàng". Nói cách khác, cho dù tôi nhấp vào nút "Thêm vào giỏ hàng" nằm trong vòng lặp (Trang chủ, trang Lưu trữ hoặc bất kỳ trang nào sử dụng vòng lặp) hoặc tôi nhấp vào nút "Thêm vào giỏ hàng" nằm trong trang Sản phẩm đơn, đoạn mã trên được thực thi trong trường hợp không có if... else if...logic.

Vì vậy, tôi muốn chạy mã riêng khi nút "Thêm vào giỏ hàng" được đặt trong vòng lặp được nhấp (bất kể vị trí của nó, cho dù Trang chủ, Lưu trữ, v.v.) và chạy mã khác khi nút "Thêm vào giỏ hàng" được đặt trên trang Sản phẩm duy nhất được nhấp. Làm thế nào tôi có thể đạt được điều này?

Mong đợi một cái gì đó như thế này:

  • Nếu nút xuất hiện bên trong vòng lặp được nhấp -> Thực hiện việc này.
  • Nếu nút xuất hiện trong trang Sản phẩm đơn được nhấp -> Thực hiện điều đó.

Câu trả lời:


1

bạn có thể sử dụng wp_get_Vferer hoặc check_ajax_Vferer () chẳng hạn:

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

Vui lòng tham khảo: Các chức năng liên quan đến Wordpress Nonces


Việc kiểm tra thủ công cho Trang chủ, trang Sản phẩm, v.v ... là quá mức cần thiết. Tôi đang cố gắng không mã hóa tên trang và thay vào đó WP xử lý nội bộ.
Devner

1

Bạn có thể thử theo cách này:

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

Nhưng bạn cần kiểm tra cài đặt của bạn. Settings > Permalinks.


Việc kiểm tra thủ công cho Trang chủ, trang Sản phẩm, v.v ... là quá mức cần thiết. Tôi đang cố gắng không mã hóa tên trang và thay vào đó WP xử lý nội bộ.
Devner

1

bạn có thể sử dụng is_product(), is_product_category()chức năng

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

Tôi mệt mỏi giải pháp của bạn. Khi tôi ở trang Sản phẩm đơn và thêm sản phẩm vào giỏ hàng, tôi mong mã $new_quantity = $quantity_from_cart * 3;sẽ hoạt động. Nhưng nó không. Nó chỉ đơn giản là tăng số lượng hiện tại trong giỏ hàng, nhưng KHÔNG nhân số lượng với 3 . Làm thế nào để khắc phục điều này?
Devner

Thử ngay, nó sẽ nhân số lượng với 3
RBT

Tôi vừa thử giải pháp sửa đổi của bạn. Nhưng bằng cách nào đó, kết quả giống như nhận xét trước đây của tôi. Nó có vẻ như rằng đối với một số lý do kỳ lạ, các mã if ( is_product() )được KHÔNG được thực thi. Tôi dường như không thể tìm thấy lý do tại sao! Có vấn đề gì không khi đó là nút AJAX Thêm vào giỏ hàng ??
Devner

0

Có vài giải pháp tôi có thể nghĩ ra. Nhưng đây là một:

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

Chúng ta có thể thêm một đầu vào ẩn bên trong biểu mẫu, mã phía trên thực hiện điều đó.
Sau đó có thể kiểm tra giá trị của nó như:

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

Xin lưu ý rằng đây chỉ là một ý tưởng và không phải là một giải pháp hoàn chỉnh ... Bạn cần quan tâm đến nút ajax.


Có vẻ như vì một số lý do kỳ lạ, mã if (is_product ()) KHÔNG được thực thi. Tôi dường như không thể tìm thấy lý do tại sao! Có vấn đề gì không khi đó là nút AJAX Thêm vào giỏ hàng ??
Người sùng đạo

với ajax, bạn cần truyền giá trị của $button_location trong yêu cầu ..
Reigel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.