Geo*_*bes 2 php wordpress woocommerce hook-woocommerce
我已将一个函数附加到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');
}
Run Code Online (Sandbox Code Playgroud)
该wc_on_place_order函数将在用户单击按钮后执行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>";
}
}
Run Code Online (Sandbox Code Playgroud)
在对 C# API 进行调试后,我注意到该服务被调用了两次,因此结账被两次保存到 API 数据库中。
该函数是否有问题wc_on_place_order或woocommerce_checkout_order_processed单击时被调用两次PLACE ORDER?
有趣的是,不知何故添加return $items后$items = $order->get_items(),C# api 仅被调用一次:
// get product details
$items = $order->get_items();
return $items; //this line
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我还想问一个问题,woocommerce_checkout_order_processed我应该使用右钩子吗?我一直在网上搜索要使用的正确挂钩,似乎woocommerce_checkout_order_processed大多数帖子都使用了该挂钩。我无法使用该woocommerce_thankyou钩子,因为如果我刷新页面,它也会调用 API。
任何想法都会非常感激。
编辑:
我使用了
woocommerce_after_checkout_validation在结帐时预验证后触发的钩子。我不记得为什么woocommerce_checkout_order_processed被解雇两次,但我只是更改了选项页面中的某种设置WooCommerce。我不记得是哪一个了。
我总是使用钩子,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' );
Run Code Online (Sandbox Code Playgroud)