如何在woocommerce_new_order钩子中获取订单项?含活动门票迁移场景
解决方案
一、替代woocommerce_new_order获取订单项
woocommerce_new_order确实会在订单项关联到订单前触发,无法直接用$order->get_items()拿到数据,你可以用以下两个钩子替代:
1. woocommerce_after_save_order(订单+订单项都保存完成后触发)
这个钩子的时机刚好在订单和所有订单项都完成保存后,能直接获取完整的订单项列表:
add_action( 'woocommerce_after_save_order', 'fetch_order_items_post_save', 10, 2 ); function fetch_order_items_post_save( $order_id, $order ) { // 验证是否是门票迁移生成的目标订单(通过parent_id判断) if ( $order->get_parent_id() > 0 ) { $items = $order->get_items(); foreach ( $items as $item ) { // 按需处理订单项 $product_id = $item->get_product_id(); $quantity = $item->get_quantity(); } } }
2. woocommerce_order_item_added(单个订单项添加时触发)
如果需要逐个处理订单项,用这个钩子更合适,每次添加一个订单项就会触发一次:
add_action( 'woocommerce_order_item_added', 'handle_single_order_item', 10, 2 ); function handle_single_order_item( $item_id, $order ) { if ( $order->get_parent_id() > 0 ) { $item = wc_get_order_item( $item_id ); // 处理单个订单项逻辑 } }
二、优化tribe_tickets_ticket_moved钩子的使用
虽然该钩子不直接传递新订单ID,但可以通过以下两种方式获取:
1. 通过旧订单ID反向查询新订单
迁移生成的新订单会把parent_id设为旧订单ID,你可以在钩子中拿到旧订单ID后,查询最新的关联订单:
add_action( 'tribe_tickets_ticket_moved', 'get_new_order_from_old', 10, 4 ); function get_new_order_from_old( $attendee_id, $from_event_id, $to_event_id, $ticket_id ) { // 获取参与者关联的旧订单ID $attendee = tribe_get_attendee( $attendee_id ); $old_order_id = $attendee['order_id']; // 查询parent_id匹配的最新订单 $new_orders = wc_get_orders( array( 'parent' => $old_order_id, 'limit' => 1, 'orderby' => 'date_created', 'order' => 'DESC', ) ); if ( ! empty( $new_orders ) ) { $new_order = reset( $new_orders ); // 直接获取新订单的订单项 $items = $new_order->get_items(); // 后续业务逻辑 } }
2. 尝试读取插件全局变量
部分版本的The Events Calendar在迁移门票时,会把新订单ID存入全局变量,你可以尝试在钩子中读取:
add_action( 'tribe_tickets_ticket_moved', 'fetch_new_order_from_global', 10, 4 ); function fetch_new_order_from_global( $attendee_id, $from_event_id, $to_event_id, $ticket_id ) { global $tribe_tickets_moved_new_order_id; if ( isset( $tribe_tickets_moved_new_order_id ) ) { $new_order = wc_get_order( $tribe_tickets_moved_new_order_id ); if ( $new_order ) { $items = $new_order->get_items(); // 处理逻辑 } } }
三、验证订单来源(可选)
为了确保只处理门票迁移生成的订单,可以额外添加验证:
- 检查订单
parent_id是否大于0 - 检查订单项的产品类型是否为
tribe-event-ticket - 查看订单备注是否包含迁移相关标识
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

