基于数量动态更新WooCommerce商品小计的问题求助
WooCommerce可变商品实时更新小计的修复方案
问题根源
原代码存在两个核心问题:
get_matching_variation函数在WooCommerce 3.0版本后已被废弃,官方建议使用数据存储类的find_matching_product_variation方法,但该方法不能直接通过产品对象调用,需先获取数据存储实例。- 原代码仅监听数量变化,未处理变体切换场景,导致用户切换变体后,小计计算仍沿用旧价格。
修复后的完整代码
add_action( 'woocommerce_after_add_to_cart_button', 'calculate_product_subtotal' ); function calculate_product_subtotal() { global $product; // 初始化商品价格 $price = $product->get_price(); // 处理可变商品的默认变体价格 if ( $product->is_type( 'variable' ) ) { $default_attributes = $product->get_default_attributes(); // 获取产品数据存储实例 $data_store = WC_Data_Store::load( 'product' ); // 通过数据存储获取匹配的默认变体ID $variation_id = $data_store->find_matching_product_variation( $product, $default_attributes ); if ( $variation_id ) { $variation = wc_get_product( $variation_id ); $price = $variation->get_price(); } } echo '<div id="subtot" style="display:inline-block; margin-left: 15px;">Total: <span></span></div>'; $currency = get_woocommerce_currency_symbol(); wc_enqueue_js( " // 封装小计计算逻辑 function updateSubtotal(price, qty) { var price_string = (price * qty).toFixed(2); jQuery('#subtot > span').html('" . esc_js( $currency ) . "' + price_string); } // 初始加载+数量变化时更新小计 var currentPrice = '" . esc_js( $price ) . "'; jQuery('[name=quantity]').on('input change', function() { var qty = jQuery(this).val(); updateSubtotal(currentPrice, qty); }).change(); // 监听变体切换事件,更新价格并重新计算小计 jQuery('.variations_form').on('show_variation', function(event, variation) { currentPrice = variation.display_price; var qty = jQuery('[name=quantity]').val(); updateSubtotal(currentPrice, qty); }); " ); }
关键修改说明
- 修复变体ID获取逻辑:通过
WC_Data_Store::load('product')获取官方推荐的数据存储实例,再调用find_matching_product_variation方法获取默认变体ID,彻底解决废弃函数的报错问题。 - 新增变体切换监听:监听WooCommerce内置的
show_variation事件,用户切换变体时自动更新当前商品价格,并同步重新计算小计。 - 封装计算函数:将重复的小计计算逻辑封装为
updateSubtotal函数,减少冗余代码,提升可维护性。
内容的提问来源于stack exchange,提问作者Ben Stewart
相关产品推荐
相关产品推荐

