成功结帐挂钩后获取订单数据
Getting order data after successful checkout hook
在 WooCommerce 中,我想在客户成功结帐后向 API 发送请求。它基本上是一个客户销售在线课程的网站(例如udemy)。
当客户结账时,我想发送一个 API 请求并为用户注册该特定课程。我尝试了几个 WooCommerce 挂钩,但 none 对我有用。
这是我正在使用的代码:
add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);
function enroll_student($order_id)
{
echo $order_id;
echo "Hooked";
}
我正在为一个插件编写这段代码,为了方便起见,我目前使用的是货到付款方式。
任何人都可以指出我哪里出错了,因为当我结账时,我看不到我正在打印的“hooked”消息,也看不到 $order_id
?
它将我带到成功页面,但没有显示我正在打印的这两件事。
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 文件或任何插件文件。
相关话题:
代码已经过测试并且有效。
Updated (to get the product Id from Orders items as asked in your comment)
也许你可以使用 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 文件或任何插件文件。
代码已经过测试并且有效。
Then you can use all class WC_Abstract_Order
methods on the $order
object.
相关:
- How to get Customer details from Order in WooCommerce?
您可以通过
获取订单的订单商品
// 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_thankyou' 钩子,'woocommerce_checkout_order_processed' 钩子是相关的钩子。 'woocommerce_checkout_order_processed' 挂钩只会被调用一次,您不需要为每个产品添加元数据,也不需要进行额外的调用以仅检查一次 运行 的代码。因为,'woocommerce_thankyou' 可以多次调用,即每次加载谢谢页面时。
替换 add_action('woocommerce_thankyou', 'enroll_student', 10, 1);
与
add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);
并删除元代码和检查。更新后的代码是
add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);
function enroll_student( $order_id ) {
// 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>';
}
在 WooCommerce 中,我想在客户成功结帐后向 API 发送请求。它基本上是一个客户销售在线课程的网站(例如udemy)。
当客户结账时,我想发送一个 API 请求并为用户注册该特定课程。我尝试了几个 WooCommerce 挂钩,但 none 对我有用。
这是我正在使用的代码:
add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);
function enroll_student($order_id)
{
echo $order_id;
echo "Hooked";
}
我正在为一个插件编写这段代码,为了方便起见,我目前使用的是货到付款方式。
任何人都可以指出我哪里出错了,因为当我结账时,我看不到我正在打印的“hooked”消息,也看不到 $order_id
?
它将我带到成功页面,但没有显示我正在打印的这两件事。
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 文件或任何插件文件。
相关话题:
代码已经过测试并且有效。
Updated (to get the product Id from Orders items as asked in your comment)
也许你可以使用 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 文件或任何插件文件。
代码已经过测试并且有效。
Then you can use all class
WC_Abstract_Order
methods on the$order
object.
相关:
- How to get Customer details from Order in WooCommerce?
您可以通过
获取订单的订单商品 // 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_thankyou' 钩子,'woocommerce_checkout_order_processed' 钩子是相关的钩子。 'woocommerce_checkout_order_processed' 挂钩只会被调用一次,您不需要为每个产品添加元数据,也不需要进行额外的调用以仅检查一次 运行 的代码。因为,'woocommerce_thankyou' 可以多次调用,即每次加载谢谢页面时。
替换 add_action('woocommerce_thankyou', 'enroll_student', 10, 1);
与
add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);
并删除元代码和检查。更新后的代码是
add_action('woocommerce_checkout_order_processed', 'enroll_student', 10, 1);
function enroll_student( $order_id ) {
// 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>';
}