WooCommerce 註冊 Action Schedule 的單次排程任務

目錄

之前做過一個需求是要讓訂單建立的 N 天後,去執行一些任務,這邊先以增加訂單備註為範例,我當時不知道是怎麼想的,我是設計成每天午夜十二點的重複排程,時間一到就會去撈出所有訂單,然後去拿今天的時間跟訂單建立時間做比較,也就是今天時間 – 訂單時間 > 5,就會寫入該訂單的備註。

這樣的寫法很複雜,因為要去做時間的計算,而且萬一訂單量非常龐大,每晚撈出所有訂單對於資料庫是不小的負擔,後來轉念才想通,我只要在訂單建立的時候建立只屬於該訂單的排程,然後把執行時間設為五天後不就解決了?

但還有一個問題是如果每張訂單都有屬於自己的排程,那麼我該如何分辨這個排程是屬於哪張訂單?一開始我想的是以訂單編號當作排程名稱,然後在執行後去抓出排程名稱的 ID,但這樣在註冊排程時又會變得太繁雜,好在 Action Schedule 有提供參數的功能,可以在註冊時就一併把訂單 ID 紀錄起來,之後就能拿到這個參數做處理,實際作法如下:

<?php

add_action( 'woocommerce_new_order', 'set_order_note_cron', 10, 2 );

function set_order_note_cron( $order_id, $order ) {
  as_schedule_single_action( strtotime( current_time( 'Y-m-d H:i:s' ) . '+5 days - 8 hour' ), 'order_note_cron', array( $order_id ) );
}

我們先在訂單成立時使用as_schedule_single_action 註冊單次排程,並且以現在時間的五天後作為觸發時間,同時以 order_note_cron 作為排程名稱,而最後就是要傳給排程的參數,用陣列的方式存放訂單 ID,接下來就可以把新增訂單備註的函式掛在這個排程上。

<?php

add_action( 'order_note_cron', 'order_note', 10, 1 );

public function order_note( $order_id ) {
    $order = wc_get_order( $order_id );
    $order->add_order_note( '這張訂單超過五天囉~' )
}

目錄

賴俊吾 / Oberon Lai
賴俊吾 / Oberon Lai

現為全職 WordPress 工程師,網站開發經歷 11 年,專攻前端工程與 WordPress 佈景主題、外掛客製化開發

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!

覺得文章對你有幫助再幫我鼓個掌吧!

相關文章

WooCommerce Notify 支援 Fluent Form 表單發送通知

很開心終於有客戶跟我許願新功能了,第一次加入的完整功能是讓使用 Fluent Forms 表單外掛的站長,能在表單送出後以手機簡訊...

WooCommerce 結帳頁自訂信用卡欄位

最近在接一家有站內付功能的金流商,因此需要在結帳頁整合信用卡資訊欄位,為了避免使用者輸入錯誤,會需要驗證卡號長度、到期日格式、安全...

發佈留言

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

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

專注於分享 WordPress 開發、接案技巧、專案管理等自由工作者必備知識與心得

© 2023 想點創意科技有限公司

想點創意科技有限公司 | 統一編號 90516823
Designed by Hend Design | 隱私權政策

訂閱電子報

Hi,我是 Oberon,我會固定在每週五早上發送接案心得以及與 WordPress 相關的電子報,同時也會分享一些實用的開發知識,讓你在 WordPress 的接案路上不孤單!