2014-09-17 10 views
11

मैं AJAX द्वारा उत्पाद पृष्ठ कार्यों पर "कार्ट में जोड़ें" बटन बनाना चाहता हूं। मैं यह कैसे कर सकता हूं? अब जब मैं किसी उत्पाद पृष्ठ पर कार्ट में जोड़ता हूं - यह पृष्ठ को रीफ्रेश करता है, मैं इसे AJAX द्वारा कैसे काम कर सकता हूं?Woocommerce - उत्पाद पृष्ठ - "कार्ट में जोड़ें" बटन पर AJAX कैसे बनाएं?

AJAX द्वारा संग्रह कार्यों पर "त्वरित दृश्य" बटन पर "कार्ट में जोड़ें" बटन - और यह बहुत अच्छा है, लेकिन मैं उत्पाद पृष्ठ पर ऐसा कैसे कर सकता हूं?

क्या कोई मेरी मदद कर सकता है? मैं बस चाहता हूं कि जब मैं उत्पाद पृष्ठ पर "मुझे घर ले जाएं" पर क्लिक करता हूं: यह उत्पाद को मेरे कार्ट में अजाक्स द्वारा चयनित विशेषताओं के साथ जोड़ देगा और उस कार्ट को खोल देगा (जैसे आप मेनू पर बैग छवि पर माउस) और बैग छवि हिलाता है।

धन्यवाद

उत्तर

7

कृपया इस पेज से पढ़ना प्रारंभ: तो फिर तुम हो

add_action('wp_ajax_add_foobar', 'prefix_ajax_add_foobar'); 
add_action('wp_ajax_nopriv_add_foobar', 'prefix_ajax_add_foobar'); 

function prefix_ajax_add_foobar() { 
    $product_id = intval($_POST['product_id']); 
// add code the add the product to your cart 
die(); 
} 

:

http://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)

सबसे पहले आप उदाहरण के लिए अपने functions.php करने के लिए कुछ कोड जोड़ने की जरूरत कुछ जावास्क्रिप्ट कोड जोड़ने के लिए जो कार्ट में जोड़ने को ट्रिगर करता है और फ़ंक्शन पर कॉल करता है:

jQuery(".add-to-cart").each(function() 
{ 


    var product_id = jQuery(this).attr('rel'); 
    var el = jQuery(this); 

    el.click(function() { 

      var data = { 
       action: 'add_foobar', 
       product_id: product_id 
      }; 

      jQuery.post('/wp-admin/admin-ajax.php' , data, function(response) { 
       if(response != 0) { 
        // do something 
       } else { 
        // do something else 
       } 

      }); 


     return false; 

    }); 

}); 

यह केवल एक उदाहरण है कि यह कैसे किया जा सकता है। हालांकि यह बहुत बुनियादी है। यह जावास्क्रिप्ट क्लासनाम .add-to-cart के साथ लिंक के लिए जांचता है और संबंधित उत्पाद के लिए रिला विशेषता की जांच करता है। फिर यह उत्पाद आईडी को PHP वर्ग में भेजता है। वहां आपको कार्ट में संबंधित उत्पाद जोड़ने के लिए कोड जोड़ने की आवश्यकता है।

मेरा सुझाव है कि आप अपनी जरूरतों को पूरा करने के लिए विषय के बारे में कुछ और खोज लें। सौभाग्य।

+0

धन्यवाद, क्या आप अधिक विशिष्ट हो सकते हैं? क्योंकि मुझे नहीं पता कि मुझे क्या जोड़ने की ज़रूरत है ... क्या आप कृपया इसके साथ मेरी मदद कर सकते हैं? मैंने कुछ भी नहीं बदला - इसलिए यह क्लासिक कोड के साथ काम करता है, क्या आप मुझे एक कोड दे सकते हैं जो मेरी समस्या को ठीक करेगा? धन्यवाद, टॉम। –

13

हम संग्रह पृष्ठ से AJAX का उपयोग कर सकते हैं। यह आसान है -

वर्ष बटन जो फार्म प्रविष्ट निकालें:

add_action('woocommerce_single_product_summary', 'woocommerce_template_loop_add_to_cart', 30); 

पी.एस.:

remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30); 

एकल उत्पाद पृष्ठ के लिए संग्रह पृष्ठ से ajax-लिंक जोड़ें जेएस कॉलबैक। WooCommerce 2.4.10 के साथ परीक्षण किया गया: उदाहरण के लिए आप और लिंक के साथ "वापस दुकान में" पॉपअप "गाड़ी" या "चेकआउट"

$('body').on('added_to_cart',function(){ 
    // Callback -> product added 
    //$('.popup').show(); 
}); 
+0

(1) जेएस कॉलबैक मेरे लिए आग नहीं लगाता है, भले ही AJAX एड-टू-कार्ट व्यवहार काम करता है। (2) जब मैं सभी उत्पादों को वैश्विक रूप जोड़ने के लिए WooCommerce उत्पाद ऐड-ऑन प्लगइन का उपयोग करता हूं, तो यह आपके समाधान को तोड़ देता है। सिंगल पेज कार्ट बटन में जोड़ें HTTP पर वापस आता है, और वैश्विक रूप प्रदर्शित नहीं होता है। –

+0

इस समाधान के साथ एक बड़ी समस्या यह है कि यदि उत्पाद उपलब्ध नहीं है तो लूप बटन एक और अधिक लिंक देता है। यदि आप इस तरह के उत्पाद पर क्लिक करते हैं तो एक और बटन फिर से पढ़ा जाता है ... किसी प्रकार का बग। –

+0

यह मेरे लिए मात्रा बॉक्स हटा देता है। – FatalError

1

जानकारी दिखा सकता है।

हम्म, अच्छी तरह से मैं इसे किसी अन्य तरीके से किया था, woocommerce पाश इस्तेमाल किया गाड़ी (woocommerce/टेम्पलेट्स/पाश/जोड़ने-टू-cart.php)

global $product; 

echo apply_filters('woocommerce_loop_add_to_cart_link', 
    sprintf('<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" data-quantity="%s" class="button %s product_type_%s">%s</a>', 
     esc_url($product->add_to_cart_url()), 
     esc_attr($product->id), 
     esc_attr($product->get_sku()), 
     esc_attr(isset($quantity) ? $quantity : 1), 
     $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '', 
     esc_attr($product->product_type), 
     esc_html($product->add_to_cart_text()) 
    ), 
$product); 

लेकिन समस्या थी में जोड़ने से कि यह सिर्फ 1 मात्रा, वास्तव में जोड़ने था, तो आप कोड है कि मात्रा में सूचीबद्ध है में देख सकते हैं: 1, तो मैं समस्या नहीं थी, जब तक मैं में this guys who saved me

ps छोड़। पहला भाग छोड़कर जहां यह उन लोगों के लिए केवल 1 उत्पाद जोड़ता है जिन्हें टोकरी में 1 से अधिक उत्पाद की आवश्यकता नहीं है, लेकिन मैंने उन लोगों के लिए एक समाधान जोड़ा जो कार्ट में जोड़े गए केवल 1 उत्पाद से अधिक की आवश्यकता है।

+2

"ये लोग जिन्होंने मुझे बचाया" लिंक टूटा हुआ है –

0

ऐड करने वाली cart.js

jQuery(document).on('click', '.product_type_simple', function() { 

var post_id = jQuery(this).data('product_id');//store product id in post id variable 
var qty = jQuery(this).data('quantity');//store quantity in qty variable 

jQuery.ajax({ 
    url : addtocart.ajax_url, //ajax object of localization 
    type : 'post', //post method to access data 
    data : 
    { 
     action : 'prefix_ajax_add_foobar', //action on prefix_ajax_add_foobar function 
     post_id : post_id, 
     quantity: qty 
    }, 

    success : function(response){ 

      jQuery('.site-header .quantity').html(response.qty);//get quantity 
      jQuery('.site-header .total').html(response.total);//get total 

      //loaderContainer.remove(); 
      alert("Product Added successfully..");   
    } 

}); 

return false; 
}); 
0

कॉपी आपकी फ़ाइल में इस कोड। उदाहरण के लिए: my-theme-wc-single-ajax-add-cart.js

function myThemeWc_SingleProductAddToCart(thisObj) { 
    if (typeof($) === 'undefined') { 
     var $ = jQuery.noConflict(); 
    } 

    var thisForm = thisObj.closest('form'); 
    var button = thisForm.find('.button'); 
    var formUrl = thisForm.attr('action'); 
    var formMethod = thisForm.attr('method'); 
    if (typeof(formMethod) === 'undefined' || formMethod == '') { 
     formMethod = 'POST'; 
    } 
    var formData = new FormData(thisForm[0]); 
    formData.append(button.attr('name'), button.val()); 

    button.removeClass('added'); 
    button.addClass('loading'); 

    myThemeWc_SingleProductCartAjaxTask = $.ajax({ 
     url: formUrl, 
     method: formMethod, 
     data: formData, 
     cache: false, 
     contentType: false, 
     processData: false 
    }) 
    .done(function(data, textStatus, jqXHR) { 
     $(document.body).trigger('wc_fragment_refresh'); 

     $.when(myThemeWc_SingleProductCartAjaxTask) 
     .then(myThemeWc_SingleProductUpdateCartWidget) 
     .done(function() { 
      button.removeClass('loading'); 
      button.addClass('added'); 
      setTimeout(function() { 
       button.removeClass('added'); 
      }, 2000); 
     }); 
    }) 
    .fail(function(jqXHR, textStatus, errorThrown) { 
     button.removeClass('loading'); 
    }) 
    .always(function(jqXHR, textStatus, errorThrown) { 
     $('.cart').off('submit'); 
     myThemeWc_SingleProductListenAddToCart(); 
    }); 
}// myThemeWc_SingleProductAddToCart 


function myThemeWc_SingleProductListenAddToCart() { 
    if (typeof($) === 'undefined') { 
     var $ = jQuery.noConflict(); 
    } 

    $('.cart').on('submit', function(e) { 
     e.preventDefault(); 
     myThemeWc_SingleProductAddToCart($(this)); 
    }); 
}// myThemeWc_SingleProductListenAddToCart 


/** 
* Update WooCommerce cart widget by called the trigger and listen to the event. 
* 
* @returns {undefined} 
*/ 
function myThemeWc_SingleProductUpdateCartWidget() { 
    if (typeof($) === 'undefined') { 
     var $ = jQuery.noConflict(); 
    } 

    var deferred = $.Deferred(); 

    $(document.body).on('wc_fragments_refreshed', function() { 
     deferred.resolve(); 
    }); 

    return deferred.promise(); 
}// myThemeWc_SingleProductUpdateCartWidget 


var myThemeWc_SingleProductCartAjaxTask; 


// on page load -------------------------------------------- 
jQuery(function($) { 
    $(document.body).on('wc_fragments_refreshed', function() { 
     console.log('woocommerce event fired: wc_fragments_refreshed'); 
    }); 

    myThemeWc_SingleProductListenAddToCart(); 
}); 

आप आप क्या चाहते करने के लिए समारोह, चर उपसर्ग myThemeWc_ बदलना पड़ सकता है।

यह कोड मूल WooCommerce एकल उत्पाद पृष्ठ का उपयोग कार्ट बटन में जोड़ता है लेकिन इसके कार्यात्मक को रोकता है और फिर फॉर्म में सभी मानों के बजाय AJAX का उपयोग करता है।

फिर इस जेएस फ़ाइल को एनक्यू करें।

add_action('wp_enqueue_scripts', 'mythemewc_enqueue_scripts'); 
function mythemewc_enqueue_scripts() { 
    if (class_exists('\\WooCommerce') && is_product()) { 
     wp_enqueue_script('mythemewc-single-product', trailingslashit(get_stylesheet_directory_uri()) . 'assets/js/my-theme-wc-single-ajax-add-cart.js', ['jquery'], false, true); 
    } 
} 

आपको लोडिंग, जोड़ा आइकन दिखाने के लिए आपको अपने सीएसएस बटन को कोड करना पड़ सकता है।
यहां सीएसएस है।

.woocommerce #respond input#submit.added::after, 
.woocommerce a.btn.added::after, 
.woocommerce button.btn.added::after, 
.woocommerce input.btn.added::after, 
.woocommerce .single_add_to_cart_button.added::after { 
    font-family: WooCommerce; 
    content: '\e017'; 
    margin-left: .53em; 
    vertical-align: bottom; 
} 
.woocommerce #respond input#submit.loading, 
.woocommerce a.btn.loading, 
.woocommerce button.btn.loading, 
.woocommerce input.btn.loading, 
.woocommerce .single_add_to_cart_button.loading { 
    opacity: .25; 
    padding-right: 2.618em; 
    position: relative; 
} 
.woocommerce #respond input#submit.loading::after, 
.woocommerce a.btn.loading::after, 
.woocommerce button.btn.loading::after, 
.woocommerce input.btn.loading::after, 
.woocommerce .single_add_to_cart_button.loading::after { 
    font-family: WooCommerce; 
    content: '\e01c'; 
    vertical-align: top; 
    font-weight: 400; 
    position: absolute; 
    right: 1em; 
    -webkit-animation: spin 2s linear infinite; 
    animation: spin 2s linear infinite; 
} 
संबंधित मुद्दे