woocommerce_checkout_order_processed функция выполнения крюка дважды

Я привязал функцию к woocommerce_checkout_order_processed hook:

 //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'); } 

Функция wc_on_place_order должна быть выполнена после нажатия пользователем кнопки PLACE ORDER . Однако, это так странно, что функция выполняется дважды.

Моя функция wc_on_place_order вызывает внешний api, написанный на C #:

 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.

Что-то не так с функцией 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 

Почему это так?

Еще один вопрос, который я хотел бы задать, – это woocommerce_checkout_order_processed правильный крючок, который я должен использовать? Я искал в Интернете правильную woocommerce_checkout_order_processed и кажется, что woocommerce_checkout_order_processed используется в большинстве сообщений. Я не могу использовать woocommerce_thankyou что он также вызывает api, если я обновляю страницу.

Любая идея будет действительно оценена.

Я всегда использую hook 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' );