Woocommerce: ตรวจสอบว่ามีการคลิกที่ปุ่ม Add to Cart หรือไม่และเรียกใช้รหัสอื่น


10

ในร้านอีคอมเมิร์ซ:

  • มีรายการที่ปรากฏในโฮมเพจและแต่ละรายการมีปุ่ม "เพิ่มลงในรถเข็น" ใต้รายการเหล่านั้น เมื่อคลิกปุ่มนี้รายการจะถูกเพิ่มลงในรถเข็น ถ้าปุ่มนี้มีการคลิกอีกครั้งจำนวนของรายการที่มีอยู่แล้วในรถเข็นสินค้าที่จะเพิ่มขึ้นโดย 1. ผมเชื่อว่านี่เป็นห่วง จนถึงตอนนี้ดีมาก

  • ในหน้าผลิตภัณฑ์เดียวมีปุ่ม "ใส่ในรถเข็น" เมื่อคลิกปุ่มนี้รายการจะถูกเพิ่มลงในรถเข็น มีช่องป้อนข้อความ Quantity เช่นกันซึ่งสามารถใช้เปลี่ยนปริมาณได้ นี่ก็ใช้ได้เช่นกัน

ปัญหา:

ฉันต้องแยกความแตกต่างระหว่างปุ่ม "เพิ่มลงในรถเข็น" ที่ถูกคลิกภายในลูป (ขณะนี้อยู่ในโฮมเพจ แต่ยังสามารถใช้กับหน้าอื่นเช่นหน้าเก็บถาวรเป็นต้น) เทียบกับปุ่ม "เพิ่มลงในรถเข็น" ที่ถูกคลิก บนหน้าผลิตภัณฑ์เดียว จากความแตกต่างนี้นี่คือสิ่งที่ฉันต้องทำ:

  • หากมีการคลิกปุ่ม "เพิ่มลงในรถเข็น" ที่ปรากฏในลูปให้คว้าจำนวนของรายการนี้ที่มีอยู่แล้วในรถเข็นโดยใช้ $cart_item_keyเพิ่มขึ้นทีละ 1 และส่งไปยังฟังก์ชันที่กำหนดเองซึ่งจะทำการประมวลผลเพิ่มเติมและบันทึกรายละเอียด ที่จะซื้ออีกครั้ง
  • หากคลิกปุ่ม "เพิ่มลงในรถเข็น" ที่ปรากฏในหน้าผลิตภัณฑ์เดียวคว้าจำนวนของรายการนี้ที่มีอยู่แล้วในรถเข็นโดยใช้ $cart_item_keyคูณด้วย 3 แล้วส่งไปยังฟังก์ชันที่กำหนดเองซึ่งจะทำการประมวลผลเพิ่มเติมและบันทึก รายละเอียดที่จะซื้ออีกครั้ง
  • ในทั้งสองกรณีข้างต้นปริมาณมีการเปลี่ยนแปลงขึ้นอยู่กับ logics ที่แตกต่างกันและปริมาณนี้จะต้องถูกส่งไปยังการเรียกใช้ฟังก์ชั่นที่กำหนดเอง

ฉันลองอะไร:

ฉันลองรหัสต่อไปนี้:

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

ปัญหาเกี่ยวกับรหัสข้างต้นคือถ้าฉันไม่มีif... else if...ตรรกะแล้วรหัสจะถูกดำเนินการโดยไม่คำนึงถึงตำแหน่งของปุ่ม "เพิ่มลงในตะกร้า" กล่าวอีกนัยหนึ่งไม่ว่าฉันจะคลิกปุ่ม "เพิ่มลงในรถเข็น" ที่อยู่ในลูป (โฮมเพจหน้าเก็บถาวรหรือหน้าใด ๆ ที่ใช้ลูป) หรือฉันคลิกปุ่ม "หยิบใส่รถเข็น" ที่อยู่ในหน้าผลิตภัณฑ์เดียว รหัสข้างต้นได้รับการดำเนินการในกรณีที่ไม่มีif... else if...ตรรกะ

ดังนั้นฉันต้องการเรียกใช้รหัสแยกต่างหากเมื่อคลิกปุ่ม "เพิ่มลงในรถเข็น" ที่อยู่ในลูป (โดยไม่คำนึงถึงสถานที่ตั้งไม่ว่าจะเป็นโฮมเพจคลังเก็บ ฯลฯ ) และเรียกใช้รหัสอื่นเมื่อปุ่ม "เพิ่มลงในรถเข็น" ที่อยู่ในหน้าผลิตภัณฑ์เดียวถูกคลิก ฉันจะบรรลุสิ่งนี้ได้อย่างไร

คาดหวังสิ่งนี้:

  • หากคลิกปุ่มที่ปรากฏในลูป -> ทำสิ่งนี้
  • หากคลิกปุ่มที่ปรากฏในหน้าผลิตภัณฑ์เดียว -> ทำอย่างนั้น

คำตอบ:


1

คุณสามารถใช้wp_get_refererหรือcheck_ajax_referer ()ตัวอย่างเช่น:

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

โปรดอ้างอิง: ฟังก์ชั่นที่เกี่ยวข้อง Wordpress Nonces


การตรวจสอบด้วยตนเองสำหรับโฮมเพจหน้าผลิตภัณฑ์และอื่น ๆ นั้นเป็นเรื่องที่เกินความจำเป็น ฉันพยายามที่จะไม่ hardcode ชื่อหน้าและค่อนข้างมี WP จัดการภายใน
Devner

1

คุณสามารถลองวิธีนี้:

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

แต่คุณต้องตรวจสอบการตั้งค่าของคุณ Settings > Permalinks.


การตรวจสอบด้วยตนเองสำหรับโฮมเพจหน้าผลิตภัณฑ์และอื่น ๆ นั้นเป็นเรื่องที่เกินความจำเป็น ฉันพยายามที่จะไม่ hardcode ชื่อหน้าและค่อนข้างมี WP จัดการภายใน
Devner

1

คุณสามารถใช้is_product(), is_product_category()ฟังก์ชั่น

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

ฉันเหนื่อยทางออกของคุณ เมื่อฉันอยู่ในหน้าผลิตภัณฑ์เดียวและเพิ่มผลิตภัณฑ์ลงในรถเข็นฉันคาดว่ารหัส$new_quantity = $quantity_from_cart * 3;จะทำงาน แต่มันไม่ได้ มันก็เพิ่มขึ้นในปัจจุบันปริมาณในรถเข็นสินค้าที่มีอยู่ แต่ไม่ไม่คูณปริมาณโดย3 จะแก้ไขได้อย่างไร?
Devner

ลองตอนนี้มันจะคูณปริมาณด้วย 3
RBT

ฉันลองใช้วิธีแก้ไขที่คุณแก้ไขแล้ว แต่อย่างใดผลลัพธ์ก็เหมือนกับความคิดเห็นก่อนหน้าของฉัน ดูเหมือนว่าด้วยเหตุผลแปลก ๆ รหัสif ( is_product() )จะไม่ถูกดำเนินการ ฉันไม่สามารถหาเหตุผลว่าทำไม! มันเป็นเรื่องสำคัญหรือไม่ที่จะเป็นปุ่ม AJAX Add to Cart?
Devner

0

มีวิธีแก้ปัญหาสองอย่างที่ฉันคิดได้ แต่นี่คือหนึ่ง:

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

เราสามารถเพิ่มอินพุตที่ซ่อนอยู่ภายในแบบฟอร์มซึ่งโค้ดด้านบนทำ
จากนั้นสามารถตรวจสอบค่าเช่น:

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

โปรดทราบว่านี่เป็นเพียงแนวคิดและไม่ใช่โซลูชันที่สมบูรณ์ ... คุณต้องดูแลปุ่ม ajax


ดูเหมือนว่าด้วยเหตุผลแปลก ๆ บางรหัสหาก (is_product ()) ไม่ได้ถูกดำเนินการ ฉันไม่สามารถหาเหตุผลว่าทำไม! ไม่ว่าจะเป็นปุ่ม AJAX Add to Cart หรือไม่?
Devner

กับอาแจ็กซ์, คุณต้องผ่านค่าของ$button_locationในคำขอ ..
Reigel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.