Woocommerce: Add to Cart बटन पर क्लिक किया गया और विभिन्न कोड चलाए गए


10

ई-कॉमर्स स्टोर में:

  • होमपेज पर प्रदर्शित आइटम हैं और प्रत्येक आइटम में उनके नीचे "कार्ट में जोड़ें" बटन है। जब यह बटन क्लिक किया जाता है, तो आइटम को कार्ट में जोड़ा जाता है। यदि इस बटन को फिर से क्लिक किया जाता है, तो आइटम की मात्रा जो पहले से ही कार्ट में मौजूद है, 1 से बढ़ जाती है। मेरा मानना ​​है कि यह लूप है । अब तक सब ठीक है।

  • एकल उत्पाद पृष्ठ पर, "कार्ट में जोड़ें" बटन है। जब इस बटन पर क्लिक किया जाता है, तो आइटम कार्ट में जुड़ जाता है। एक क्वांटिटी इनपुट टेक्स्टबॉक्स है, जिसका उपयोग मात्रा को बदलने के लिए किया जा सकता है। यह ठीक भी है।

समस्या:

मुझे "कार्ट में जोड़ें" बटन के बीच अंतर करने की आवश्यकता है जो लूप के भीतर क्लिक की गई थी (वर्तमान में मुखपृष्ठ पर, लेकिन इसका उपयोग अन्य पृष्ठों जैसे कि आर्काइव पेज आदि पर भी किया जा सकता है) बनाम "Add to Cart" बटन पर क्लिक किया गया था एकल उत्पाद पृष्ठ पर। इस भेदभाव के आधार पर, यहाँ मुझे यह करने की आवश्यकता है:

  • यदि लूप के भीतर दिखाई देने वाली "कार्ट में जोड़ें" बटन पर क्लिक किया गया था, तो इस आइटम की मात्रा को पकड़ें जो पहले से ही कार्ट का उपयोग करके मौजूद है $cart_item_key, इसे 1 से बढ़ाएं और इसे एक कस्टम फ़ंक्शन पर भेजें जो अतिरिक्त प्रसंस्करण करेगा और विवरण बचाएगा। फिर से गाड़ी चलाना।
  • यदि एकल उत्पाद पृष्ठ में प्रदर्शित "कार्ट में जोड़ें" बटन पर क्लिक किया गया था, तो इस आइटम की मात्रा को पकड़ो जो पहले से ही कार्ट का उपयोग करके मौजूद है $cart_item_key, इसे 3 से गुणा करें और इसे एक कस्टम फ़ंक्शन पर भेजें जो अतिरिक्त प्रसंस्करण करेगा और बचाएगा। फिर से गाड़ी चलाने का विवरण।
  • उपरोक्त दोनों मामलों में, अलग-अलग लॉजिक्स के आधार पर क्वांटिटी को बदला जा रहा है, और इस क्वांटिटी को कस्टम फ़ंक्शन कॉल पर भेजने की आवश्यकता है।

मैंने क्या कोशिश की:

मैंने निम्नलिखित कोड आज़माया:

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...तर्क की अनुपस्थिति में निष्पादित किया जाता है।

इसलिए, मैं अलग कोड चलाना चाहता हूं जब "Add to Cart" बटन जो लूप में स्थित होता है, उस पर क्लिक किया जाता है (चाहे उसका स्थान, चाहे होमपेज, अभिलेखागार, आदि) और "Add to Cart" बटन पर अलग-अलग कोड चलाएं। जो एकल उत्पाद पृष्ठ पर स्थित है उस पर क्लिक किया जाता है। इसे कैसे प्राप्त किया जा सकता है?

कुछ इस तरह की उम्मीद:

  • यदि लूप के अंदर दिखाई देने वाले बटन पर क्लिक किया जाता है -> ऐसा करें।
  • यदि एकल उत्पाद पृष्ठ में दिखाई देने वाले बटन पर क्लिक किया जाता है -> ऐसा करें।

जवाबों:


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 गैर संबंधित कार्य


मुखपृष्ठ, उत्पाद पृष्ठ, आदि के लिए मैनुअल चेक एक ओवरकिल हैं। मैं पृष्ठ के नामों को हार्डकोड नहीं करने की कोशिश कर रहा हूं और बल्कि WP को आंतरिक रूप से संभालना है।
डेवनेर

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


मुखपृष्ठ, उत्पाद पृष्ठ, आदि के लिए मैनुअल चेक एक ओवरकिल हैं। मैं पृष्ठ के नामों को हार्डकोड नहीं करने की कोशिश कर रहा हूं और बल्कि WP को आंतरिक रूप से संभालना है।
डेवनेर

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 से गुणा नहीं करता है । इसे कैसे ठीक करें?
डेवनेर

अब कोशिश करें कि यह मात्रा 3 से बढ़ जाएगी
RBT

मैंने सिर्फ आपके संशोधित समाधान की कोशिश की। लेकिन किसी भी तरह, परिणाम मेरी पिछली टिप्पणी के समान है। ऐसा लगता है कि कुछ अजीब कारण के लिए, कोड लगता if ( is_product() )है नहीं निष्पादित किया जा रहा। मैं कारण खोजने के लिए प्रतीत नहीं कर सकते! क्या फर्क पड़ता है कि यह AJAX Add to Cart बटन है ??
डिवनेर

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 बटन है ??
डिवनेर

अजाक्स के साथ, आपको $button_locationअनुरोध के मूल्य को पारित करने की आवश्यकता है ..
रिगेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.