成功结帐钩子后获取订单数据

Posted

技术标签:

【中文标题】成功结帐钩子后获取订单数据【英文标题】:Getting order data after successful checkout hook 【发布时间】:2017-07-20 17:10:00 【问题描述】:

在 WooCommerce 中,我想在客户成功结账后向 API 发送请求。它基本上是一个客户销售在线课程的网站(例如 udemy)。

当客户结帐时,我想发送一个 API 请求并为该用户注册该特定课程。我尝试了几个 WooCommerce 钩子,但没有一个对我有用。

这是我正在使用的代码:

add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);

function enroll_student($order_id)

    echo $order_id;
    echo "Hooked";

我正在为插件编写此代码,为了使其更容易,我目前正在使用货到付款方式。

谁能指出我哪里出错了,因为当我结帐时,我看不到我正在打印的“上钩”消息,也看不到 $order_id

它带我进入成功页面,但没有显示我正在打印的这两件事。

【问题讨论】:

【参考方案1】:

更新 2 仅适用于 Woocommerce 3+ (添加了仅执行一次代码的限制)

add_action('woocommerce_thankyou', 'enroll_student', 10, 1);
function enroll_student( $order_id ) 
    if ( ! $order_id )
        return;

    // Allow code execution only once 
    if( ! get_post_meta( $order_id, '_thankyou_action_done', true ) ) 

        // Get an instance of the WC_Order object
        $order = wc_get_order( $order_id );

        // Get the order key
        $order_key = $order->get_order_key();

        // Get the order number
        $order_key = $order->get_order_number();

        if($order->is_paid())
            $paid = __('yes');
        else
            $paid = __('no');

        // Loop through order items
        foreach ( $order->get_items() as $item_id => $item ) 

            // Get the product object
            $product = $item->get_product();

            // Get the product Id
            $product_id = $product->get_id();

            // Get the product name
            $product_id = $item->get_name();
        

        // Output some data
        echo '<p>Order ID: '. $order_id . ' — Order Status: ' . $order->get_status() . ' — Order is paid: ' . $paid . '</p>';

        // Flag the action as done (to avoid repetitions on reload for example)
        $order->update_meta_data( '_thankyou_action_done', true );
        $order->save();
    

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

相关话题:

Get Order items and WC_Order_Item_Product in WooCommerce 3 How to get WooCommerce order details

代码已经过测试并且可以运行。


更新(按照您评论中的要求从 Orders 项目中获取 产品 ID

也许你可以改用 woocommerce_thankyou 钩子,它会在订单接收页面上显示你的回显代码,这样:

add_action('woocommerce_thankyou', 'enroll_student', 10, 1);
function enroll_student( $order_id ) 

    if ( ! $order_id )
        return;

    // Getting an instance of the order object
    $order = wc_get_order( $order_id );

    if($order->is_paid())
        $paid = 'yes';
    else
        $paid = 'no';

    // iterating through each order items (getting product ID and the product object) 
    // (work for simple and variable products)
    foreach ( $order->get_items() as $item_id => $item ) 

        if( $item['variation_id'] > 0 )
            $product_id = $item['variation_id']; // variable product
         else 
            $product_id = $item['product_id']; // simple product
        

        // Get the product object
        $product = wc_get_product( $product_id );

    

    // Ouptput some data
    echo '<p>Order ID: '. $order_id . ' — Order Status: ' . $order->get_status() . ' — Order is paid: ' . $paid . '</p>';

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

代码已经过测试并且可以工作。

然后您可以在 $order 对象上使用所有类 WC_Abstract_Order 方法。

相关:

How to get WooCommerce order details Get Order items and WC_Order_Item_Product in WooCommerce 3 How to get Customer details from Order in WooCommerce?

【讨论】:

感谢您的回答。我用Thankyou页面钩子检查了它,它显示了预期的结果,但我可以在这个钩子中获取产品数据吗?我想在结帐后获取产品 ID 并将其传递给外部 API 一个问题:如果用户刷新感谢页面,它会向API发送另一个请求 @sanjeev 更新了 Woocommerce 3 的代码并添加了一个限制,只允许此代码执行一次。 问题 2:如果管理员手动创建订单则不起作用。我自己也遇到了那个用例 @LoicTheAztec 只是认为人们应该知道他们是否找到了这个!除了那个特定的用例之外,您的解决方案对我来说非常有效。【参考方案2】:

您可以通过以下方式获取订单的订单商品

   // Getting an instance of the order object

    $order = new WC_Order( $order_id );
    $items = $order->get_items();

   //Loop through them, you can get all the relevant data:

    foreach ( $items as $item ) 
        $product_name = $item['name'];
        $product_id = $item['product_id'];
        $product_variation_id = $item['variation_id'];
    

【讨论】:

以上是关于成功结帐钩子后获取订单数据的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce-在使用get_value插入钩子函数后,结帐列上的空白内容

等到第一个钩子完成后再获取数据

在 WooCommerce 结帐时将产品详细信息从订单传递到 jQuery/javascript

git-clone 和结帐后挂钩

drupal :: 订购完整的钩子并升级用户权限/角色

useEffect 钩子完成后如何渲染组件?