自定义AJAX添加商品后,无法实时更新WooLentor侧边购物车
解决WooLentor侧边购物车AJAX加购后不实时更新的问题
针对你自定义可变商品加购功能后,WooLentor侧边购物车无法实时刷新的问题,核心原因是自定义AJAX流程没有触发WooCommerce及WooLentor监听的购物车更新事件,以下是具体解决方案:
1. 修改PHP处理函数,返回标准购物车片段
WooCommerce通过购物车片段(cart fragments)实现页面元素的局部更新,我们需要在加购成功后返回这些片段,而不是仅返回"success"状态:
add_action('wp_ajax_nav_add_to_cart', 'nav_add_to_cart'); add_action('wp_ajax_nopriv_nav_add_to_cart', 'nav_add_to_cart'); function nav_add_to_cart() { $product_id = (int) $_REQUEST['product_id']; $quantity = $_REQUEST['nav_quantity']; $variation_id = (int) $_REQUEST['variation_id']; $product_status = get_post_status($product_id); $added = false; if ('publish' === $product_status) { $added = WC()->cart->add_to_cart($product_id, $quantity, $variation_id); } if ($added) { // 生成并返回WooCommerce标准购物车片段 ob_start(); woocommerce_mini_cart(); $mini_cart = ob_get_clean(); wp_send_json_success(array( 'mini_cart' => $mini_cart, 'cart_count' => WC()->cart->get_cart_contents_count(), 'cart_total' => WC()->cart->get_cart_total() )); } else { wp_send_json_error('商品添加失败'); } wp_die(); }
2. 优化前端AJAX代码,触发购物车更新事件
将同步AJAX改为异步(避免阻塞页面),并在所有加购请求完成后,触发WooCommerce原生事件及WooLentor的刷新逻辑:
jQuery('body').on('click','.nav_var_add_to_cart', function(){ var ajaxRequests = []; // 收集所有选中变体的AJAX请求 jQuery(".nav_var_option.active").each(function(i , obj) { let product_id = jQuery(obj).find('.nav_text').attr('data_pid'); let var_id = jQuery(obj).find('.nav_text').attr('nav-var'); let qty = jQuery("[data_var="+var_id+"]").find('.qty').val(); var request = jQuery.ajax({ type : "post", async: true, cache: false, timeout: 30000, url : '<?php echo admin_url("admin-ajax.php"); ?>', data : { action: "nav_add_to_cart", product_id : product_id, variation_id : var_id, nav_quantity : qty }, error: function(){ alert("该商品添加出错"); } }); ajaxRequests.push(request); }); // 等待所有请求完成后统一处理刷新 jQuery.when.apply(jQuery, ajaxRequests).done(function() { alert("所有选中商品已添加到购物车"); // 触发WooCommerce原生购物车更新事件 jQuery(document.body).trigger('wc_update_cart'); jQuery(document.body).trigger('wc_fragment_refresh'); jQuery(document.body).trigger('wc_cart_updated'); // 尝试调用WooLentor侧边购物车专属刷新方法(根据版本调整) if (typeof WooLentorMiniCart !== 'undefined') { WooLentorMiniCart.refresh(); } else if (typeof jQuery.fn.woolentorMiniCart !== 'undefined') { jQuery('.woolentor-mini-cart').woolentorMiniCart('refresh'); } // Fallback:手动请求最新购物车片段并更新DOM jQuery.ajax({ url: wc_cart_fragments_params.wc_ajax_url.toString().replace('%%endpoint%%', 'get_refreshed_fragments'), type: 'POST', success: function(data) { if (data && data.fragments) { jQuery.each(data.fragments, function(key, value) { jQuery(key).replaceWith(value); }); jQuery(document.body).trigger('wc_fragments_refreshed'); } } }); }).fail(function() { alert("部分商品添加失败,请重试"); }); });
3. 确保WooCommerce购物车片段脚本加载
如果你的页面没有默认加载WooCommerce的购物车片段脚本,添加以下代码确保其加载:
add_action('wp_enqueue_scripts', 'enqueue_wc_cart_fragments'); function enqueue_wc_cart_fragments() { if (function_exists('is_woocommerce') && is_woocommerce()) { wp_enqueue_script('wc-cart-fragments'); } }
关键说明
- WooLentor的侧边购物车依赖WooCommerce的购物车更新事件或自身封装的刷新方法,触发这些事件后插件会自动重新渲染购物车内容。
- 若上述方法无效,可查看WooLentor的前端JS代码,找到其对应的购物车刷新函数名,替换代码中的调用逻辑即可。
内容的提问来源于stack exchange,提问作者Naveed Khan
相关产品推荐
相关产品推荐

