成功结帐挂钩后获取订单数据 [英] Getting order data after successful checkout hook

查看:151
本文介绍了成功结帐挂钩后获取订单数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在WooCommerce中,一旦客户成功签出,我想向API发送请求.它基本上是一个客户在其中出售在线课程的网站(例如 udemy ).

In WooCommerce, I would like to send a request to an API once the customer has successfully checked out. Its basically a website where the client is selling online courses (Like udemy).

当客户退房时,我想发送一个API请求并为该课程的用户注册.我尝试了多个WooCommerce挂钩,但没有一个对我有用.

When the customer checks out, I would like to send an API request and enroll the user for that particular course. I have tried several WooCommerce hooks but none worked for me.

这是我正在使用的代码:

This is the code that I'm using:

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

function enroll_student($order_id)
{
    echo $order_id;
    echo "Hooked";
}

我正在激活的插件中编写此代码,为简便起见,我当前使用的是货到付款方式.

I am writing this code inside an activated plugin and for ease, I am currently using Cash on Delivery method.

有人可以指出我要去哪里了,因为结帐时我看不到我正在打印的消息钩住了",也看不到 $order_id ?

Can anyone point me out where I am going wrong because when I checkout I cant see the message "hooked" that I am printing nor the $order_id?

这将我带到成功页面,并且没有显示我正在打印的这两件事.

It takes me to the success page and doesn't show these two things that I am printing.

推荐答案

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

Update 2 Only For Woocommerce 3+ (added restriction to execute the code only once)

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

该代码已经过测试并且可以正常工作.

已更新(根据您的评论中的要求从订单"项中获取产品ID )

Updated (to get the product Id from Orders items as asked in your comment)

也许您可以使用 woocommerce_thankyou 钩子,该钩子将以这种方式在收到订单的页面上显示您的回显代码:

May be you could use woocommerce_thankyou hook instead, that will display on order-received page your echoed code, this way:

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文件或任何插件文件中.

该代码已经过测试并且可以正常工作.

The code is tested and works.

然后,您可以使用所有类 WC_Abstract_Order $order 对象上的> 方法.

相关:

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆