WooCommerce购物车数量超库存时自动修改配送时间方法
WooCommerce 超库存自动切换配送时间实现方案
适配环境:WooCommerce + Germanized 插件,所有代码写入主题目录下的functions.php文件即可生效。
原有代码说明
你之前编写的两段代码可以直接保留:
- 后台商品编辑面板新增「缺货场景配送时间」配置字段的逻辑
- 库存为0时自动渲染备用配送时间的过滤器逻辑
原有逻辑存在三处缺口:
- 商品详情页用户调整购买数量超过库存时,没有实时触发配送时间切换的前端交互
- 购物车、结算页、迷你购物车中,已加购商品数量超过库存时,没有服务端校验替换配送时间的逻辑
- 你之前写的半段数量监听JS没有闭合,也没有实际操作DOM修改配送时间的逻辑,可变商品切换变体时也不会更新库存判断值
需要补充的完整代码
1. 替换原有半段的商品页实时交互逻辑
把你之前写的未完成的woocommerce_stock_now函数整个替换为以下代码:
add_action( 'woocommerce_single_product_summary', 'wdt_qty_delivery_time_switch', 20 ); function wdt_qty_delivery_time_switch() { global $product; // 初始化简单商品默认库存值 $default_stock = $product->get_stock_quantity(); // 提前获取当前商品的缺货配送时间文本,复用公共逻辑 $fallback_text = wdt_get_fallback_delivery_text($product->get_id()); ?> <script> jQuery(function($){ // 初始化变量 let currentStock = parseInt('<?php echo esc_js($default_stock); ?>'); const fallbackDeliveryTime = '<?php echo esc_js($fallback_text); ?>'; const $deliveryEl = $('.wc-gzd-delivery-time'); const normalDeliveryTime = $deliveryEl.text().trim(); // 切换配送时间的公共方法 function toggleDeliveryTime(qty){ if(parseInt(qty) > currentStock && currentStock >=0){ $deliveryEl.text(fallbackDeliveryTime); }else{ $deliveryEl.text(normalDeliveryTime); } } // 监听数量输入变化 $(document).on('input change','input.qty',function(){ const currentQty = $(this).val(); toggleDeliveryTime(currentQty); }); // 兼容可变商品:监听变体切换,更新当前库存值 $(document).on('found_variation', 'form.variations_form', function(event, variation){ currentStock = parseInt(variation.max_qty); const currentQty = $('input.qty', this).val(); toggleDeliveryTime(currentQty); }); // 可变商品重置选项时,切回默认库存 $(document).on('reset_data', 'form.variations_form', function(){ currentStock = parseInt('<?php echo esc_js($default_stock); ?>'); $deliveryEl.text(normalDeliveryTime); }); }); <?php }
2. 新增公共方法获取缺货配送时间文本
把重复获取fallback配送时间的逻辑抽成公共函数,减少冗余代码和数据库查询:
// 公共方法:获取商品配置的缺货配送时间 function wdt_get_fallback_delivery_text($product_id){ // 可变商品读取父商品配置 $parent_id = wp_get_post_parent_id($product_id); $target_id = $parent_id ? $parent_id : $product_id; $dtf_id = get_post_meta($target_id, '_delivery_time_fallback', true); if(!empty($dtf_id)){ $term = get_term($dtf_id, 'product_delivery_time'); if(!is_wp_error($term) && $term){ return 'Lieferzeit: ' . $term->name; } } // 无自定义配置时返回默认文本 return 'Lieferzeit: 1-2 Wochen ab Bestelldatum'; }
3. 新增购物车/结算页配送时间过滤器
服务端校验购物车商品数量,超库存时强制返回缺货配送时间,避免前端缓存、篡改导致显示错误:
// 接管购物车、结算页、迷你购物车的配送时间输出 add_filter('woocommerce_germanized_delivery_time_html', 'wdt_cart_check_delivery_time', 15, 4); function wdt_cart_check_delivery_time($html, $product, $args, $view){ // 只在购物车、结算、AJAX加载迷你购物车场景校验,商品页交给前端JS实时处理 if(!is_cart() && !is_checkout() && !defined('WC_DOING_AJAX')){ return $html; } // 获取当前商品在购物车中的数量 $cart_item_qty = 0; foreach(WC()->cart->get_cart() as $cart_item){ if($cart_item['product_id'] == $product->get_id() || $cart_item['variation_id'] == $product->get_id()){ $cart_item_qty = $cart_item['quantity']; break; } } // 获取商品实际库存 $stock_qty = $product->get_stock_quantity(); // 数量超库存时返回缺货配送时间 if($cart_item_qty > $stock_qty && $stock_qty >=0){ return wdt_get_fallback_delivery_text($product->get_id()); } return $html; }
原有代码优化提示
你之前写的wdt_adjust_delivery_time_html函数可以简化,直接调用公共方法即可,替换成下面的版本减少重复代码:
add_filter( 'woocommerce_germanized_delivery_time_backorder_html', 'wdt_adjust_delivery_time_html', 10, 4 ); function wdt_adjust_delivery_time_html( $text, $product ) { return wdt_get_fallback_delivery_text($product->get_id()); }
注意事项
- 所有代码添加前请备份原
functions.php文件,避免语法错误导致站点异常 - 代码兼容简单商品、可变商品,覆盖商品页实时切换、购物车/结算页服务端校验双场景
- 如果你的主题修改了Germanized配送时间的DOM类名,只需要把JS里的
$('.wc-gzd-delivery-time')选择器改成你站点实际的配送时间元素类名即可
内容的提问来源于stack exchange,提问作者Maikeeey
相关产品推荐
相关产品推荐

