我已将一个函数附加到woocommerce_checkout_order_processed
钩子:
//check if woocommerce is acive
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
add_action('woocommerce_checkout_order_processed', 'wc_on_place_order');
}
在用户点击 PLACE ORDER 按钮后执行wc_on_place_order
功能。但是,这个函数执行两次很奇怪。
我的wc_on_place_order
函数调用用C#编写的外部api:
function wc_on_place_order( $order_id ) {
global $wpdb;
// get order object and order details
$order = new WC_Order( $order_id );
// get product details
$items = $order->get_items();
//return $items;
$products = array();
foreach ($items as $item) {
array_push($products,
array('userid' => $order->user_id, 'descr' => $item['name'], 'amt' => (float)$item['line_total'])
);
}
//passing $products to external api using `curl_exec`
. . . .
//on successful call, the page should be showing an `alert`, however, it does not
// the handle response
if (strpos($response,'ERROR') !== false) {
print_r($response);
} else {
echo "<script type='text/javascript'>alert($response)</script>";
}
}
在C#API上调试之后,我注意到服务被调用了两次,因此,结账被保存两次到API数据库。
单击 PLACE ORDER 时,wc_on_place_order
函数是否有问题或woocommerce_checkout_order_processed
被调用了两次?
有趣的是,在return $items
以某种方式添加$items = $order->get_items()
后,C#api只被调用一次:
// get product details
$items = $order->get_items();
return $items; //this line
为什么会这样?
我想问的另一个问题是,woocommerce_checkout_order_processed
我应该使用正确的钩子吗?我一直在网上搜索正确使用的钩子,似乎woocommerce_checkout_order_processed
用于最多的帖子。我无法使用woocommerce_thankyou
挂钩,因为如果我刷新页面,它也会调用API。
任何想法都会非常感激。
修改
我使用
woocommerce_after_checkout_validation
挂钩,在结帐时进行预验证后触发。我无法记住为什么woocommerce_checkout_order_processed
被解雇了两次,但我刚刚在WooCommerce
选项页面中更改了某种设置。我无法记住哪一个。
答案 0 :(得分:1)
我总是使用挂钩woocommerce_payment_complete
这将在订单付款后按名称显示。
function order_payment_complete( $order_id ){
$order = wc_get_order( $order_id );
/* Insert your code */
}
add_action( 'woocommerce_payment_complete', 'order_payment_complete' );