Я привязал функцию к 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' );