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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:30:48