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

WooCommerce平台两款票务产品共享同一库存的实现方案咨询

WooCommerce 多产品共享库存实现方案

前置说明

当前需求为普通票、会员专属票两款独立产品共享1000张总库存,早鸟VIP票、早鸟票维持原有独立库存逻辑,以下提供两种可落地的实现方案:

方案一:可变产品改造(零代码,兼容性最优)

无需保留两款独立的简单产品,将普通票、会员专属票整合为同一可变产品的两个变体,直接复用WooCommerce原生库存逻辑:

  • 新建可变产品,产品名称可设置为「常规入场票」,在库存选项卡勾选启用库存管理,总库存设为1000,库存管理模式选择产品级别统一管理
  • 为产品新增「购票身份」属性,属性值设置为「普通用户票」「会员专属票」
  • 分别设置两个变体的定价与可见权限:普通票设原价、对所有用户开放,会员专属票设会员优惠价、仅对有效会员可见
  • 早鸟VIP票、早鸟票仍保留为独立简单产品,原有独立库存配置无需改动

该方案完全基于WooCommerce原生功能实现,不会和Tickera、WooCommerce Memberships插件产生兼容性冲突,也不会出现超卖风险。

方案二:自定义代码实现独立产品库存联动

如果必须保留两款独立的简单产品(例如适配已有的订单统计、Tickera票务标识规则),可以通过WooCommerce钩子函数实现两款产品的库存同步:

基础配置

首先记录两款产品的ID:普通票ID记为123(作为库存主节点,初始库存设为1000)、会员专属票ID记为456(关闭其原生库存管理功能)

代码实现

将以下代码添加到主题的functions.php文件或自定义代码片段插件中:

1. 下单联动扣减库存

add_action('woocommerce_checkout_order_processed', 'sync_shared_ticket_stock', 10, 3);
function sync_shared_ticket_stock($order_id, $posted_data, $order) {
    // 替换为实际的普通票、会员票产品ID
    $regular_ticket_id = 123;
    $member_ticket_id = 456;

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        $buy_qty = $item->get_quantity();
        if (in_array($product_id, [$regular_ticket_id, $member_ticket_id])) {
            // 扣减主节点库存
            $new_stock = wc_update_product_stock($regular_ticket_id, $buy_qty, 'decrease');
            // 同步更新会员票前端显示的库存
            wc_update_product_stock($member_ticket_id, $new_stock, 'set');
        }
    }
}

2. 订单取消/退款联动回滚库存

add_action('woocommerce_order_status_cancelled', 'rollback_shared_ticket_stock', 10, 1);
add_action('woocommerce_order_status_refunded', 'rollback_shared_ticket_stock', 10, 1);
function rollback_shared_ticket_stock($order_id) {
    // 替换为实际的普通票、会员票产品ID
    $regular_ticket_id = 123;
    $member_ticket_id = 456;
    $order = wc_get_order($order_id);

    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        $refund_qty = $item->get_quantity();
        if (in_array($product_id, [$regular_ticket_id, $member_ticket_id])) {
            // 回滚主节点库存
            $new_stock = wc_update_product_stock($regular_ticket_id, $refund_qty, 'increase');
            // 同步更新会员票前端显示的库存
            wc_update_product_stock($member_ticket_id, $new_stock, 'set');
        }
    }
}

3. 前端库存展示同步

add_filter('woocommerce_product_get_stock_quantity', 'sync_shared_stock_frontend', 10, 2);
function sync_shared_stock_frontend($stock_qty, $product) {
    // 替换为实际的普通票、会员票产品ID
    $regular_ticket_id = 123;
    $member_ticket_id = 456;
    if ($product->get_id() === $member_ticket_id) {
        return wc_get_product($regular_ticket_id)->get_stock_quantity();
    }
    return $stock_qty;
}

验证方式

配置完成后分别下单普通票、会员票,检查两款产品的库存是否同步扣减,取消订单后库存是否同步回滚,确认总库存始终不超过初始设定的1000即可。早鸟VIP、早鸟票的独立库存不受上述代码影响,原有配置无需调整。

内容的提问来源于stack exchange,提问作者vanlooverenkoen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:57:05