Woocommerce如何实现购物车多商品合并为单条预约记录
WooCommerce 购物车多票种合并为单条预约实现方案
实现思路
核心逻辑是给同一个预约场次的所有票种商品绑定唯一的场次标识,下单时将同一场次下的所有商品关联到同一条预约记录,替代默认按单个商品拆分预约的逻辑。
具体实现步骤
- 第一步:给商品扩展场次元字段
先给每个票种商品增加预约场次自定义元字段,相同日期/场次的成人票、儿童票、老人票绑定同一个场次ID,用来标识它们属于同一个预约。你可以用woocommerce_product_options_general_product_data钩子在后台商品编辑页添加场次输入框,用woocommerce_process_product_meta钩子保存字段值。 - 第二步:购物车挂载场次标识
用户加购商品时,将对应商品的场次ID存入购物车项的自定义数据中,用到woocommerce_add_cart_item_data钩子实现,确保同一个场次下的所有票种购物车项都携带相同的场次ID。 - 第三步:下单时合并生成单条预约记录
订单创建完成后,遍历订单内的所有商品,按场次ID分组,每组生成一条预约记录,把同组内所有票种的数量、类型都存入这条预约的元数据中。这里用woocommerce_checkout_create_order钩子处理,也可以根据你的业务触发时机换成woocommerce_order_status_completed等钩子。
示例代码逻辑参考:add_action('woocommerce_checkout_create_order', 'merge_booking_items_by_session', 10, 2); function merge_booking_items_by_session( $order, $data ) { $session_groups = []; // 遍历所有订单项按场次分组 foreach( $order->get_items() as $item_id => $item ) { $product = $item->get_product(); $session_id = $product->get_meta('booking_session_id'); if( !isset($session_groups[$session_id]) ) { $session_groups[$session_id] = [ 'session_id' => $session_id, 'booking_date' => $product->get_meta('booking_date'), 'ticket_list' => [] ]; } // 存入当前票种的信息 $session_groups[$session_id]['ticket_list'][] = [ 'ticket_type' => $product->get_name(), 'quantity' => $item->get_quantity(), 'unit_price' => $item->get_subtotal() / $item->get_quantity() ]; } // 每组生成一条预约记录,booking_record替换为你实际用的预约自定义文章类型别名 foreach( $session_groups as $session ) { $booking_id = wp_insert_post([ 'post_type' => 'booking_record', 'post_title' => '预约记录-'.$session['booking_date'], 'post_status' => 'publish', 'meta_input' => [ 'related_order_id' => $order->get_id(), 'session_detail' => $session ] ]); } } - 第四步:前端与后台展示适配
修改预约列表页的展示逻辑,每条预约记录下展示对应所有票种的类型、数量、单价等信息,同时同步调整用户中心预约查询、订单邮件通知的模板,适配合并后的预约结构。
注意事项
- 如果你用的是第三方预约插件实现的预约功能,只需要找到插件生成预约记录的官方钩子,替换上面示例中自定义创建预约的逻辑即可,不需要完全重构预约体系。
- 加购阶段可以增加场次校验规则,避免用户把不同场次的票种加入同一个购物车导致合并逻辑异常,也可以加提示引导用户分批次结算不同场次的票。
内容的提问来源于stack exchange,提问作者Harsh Solanki
相关产品推荐
相关产品推荐

