You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:57:19