2017-10-11 98 views
0

我已附加如下功能:在woocommerce_checkout_order_processed鉤: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'); 
} 

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>"; 
    } 
} 

在C#API調試後,我注意到它的服務被稱爲兩次,因此,結賬時被保存兩次到API數據庫。

點擊PLACE ORDER時是不是有什麼毛病wc_on_place_order功能或者是woocommerce_checkout_order_processed叫了兩聲?

有趣的是,加入$items = $order->get_items()莫名其妙後return $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。

任何想法將非常感激。

回答

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'); 
+0

這有效,但生病會尋找更好的鉤子。似乎我不能阻止woocommerce從此鉤子重定向到「謝謝」頁面 –

+0

您可以在結賬後將用戶重定向到不同的頁面,是否可以解決您的問題? –

+0

我想留在當前頁面。請參閱我正在調用外部API以檢查當前用戶是否在該端點上有餘額,然後如果用戶沒有餘額,我想顯示錯誤消息或其他內容。 –