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
相关产品推荐
相关产品推荐

