[WooCommerce] 程式開發時判斷建立訂單的時機

預設 WooCommerce 建立訂單的時候大部分金流(Payment Gateway)都會把訂單狀態設定成「等待付款中」,這個時候 WooCommerce 系統還不會觸發「新訂單」通知,會等待金流操作完成後改變狀態為「保留」或是「處理中」才會通知。

問題來了,如果我就是要在訂單一被建立的時候發新訂單通知怎麼辦?(參考:[WooCommerce] 程式化觸發訂單狀態發信機制

有兩個方向可以下手:

  • 建立訂單
  • 感謝頁面

感謝頁面的 Hook 是 woocommerce_thankyou 或是根據付款方式的 woocommerce_thankyou_{$payment_method} 組合技。

不過缺點是如果這個頁面被重新整理就會重複觸發程式裡的設定,不是這麼的保險。(設定程式中的lock也有點多了)

所以還是抓準訂單被建立的事件來處理比較合適: wp_insert_postwoocommerce_new_order

wp_insert_post 是 WordPress 最原生的新增內容的方法,WooCommerce 在這邊也是使用它來對資料庫新增一筆資料,觸發時機比 woocommerce_new_order 還早,也是可以掌握的時機點。

下方以 wp_insert_post 來舉例針對判斷新增訂單的事件處理程式碼片段:

function mxp_wc_new_order_event($order_id, $post, $update) {
    if ($post->post_type == "shop_order" && WC()->session->chosen_payment_method=="cod") {
        $mailer = WC()->mailer();
        $mails = $mailer->get_emails();
        if (!empty($mails)) {
            foreach ($mails as $mail) {
                if ($mail->id == 'new_order') {
                    $mail->trigger($order_id);
                }
            }
        }
    }
}
add_action('wp_insert_post', 'mxp_wc_new_order_event', 11, 3);

情境為當付款方式為貨到付款且為訂單格式的時候會觸發「新訂單」信件。

而 WooCommerce 內建的事件如下,上述邏輯就不贅述了:

function mxp_woocommerce_new_order( $order_id) {
    //拿著訂單編號想幹嘛就幹嘛啦~
};
add_action( 'woocommerce_new_order', 'mxp_woocommerce_new_order', 10, 1 );

Facebook 外掛功能


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

參與討論

2 則留言

  1. 「訂單一被建立的時候發新訂單通知」,咦,這個我目前好像就會會了耶,我曾試過支票付款的方式,一建立訂單就有通知了說,還是現在的版本有變嗎?

    1. 我不確定之前的版本會不會,但目前測試過「等待付款中」的狀態時如果沒有主動去觸發是不會發信的。每個金流實作的方式不同,也要看看是否是有自己觸發以及中間有過轉換訂單狀態的瞬間。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *