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( '這張訂單超過五天囉~' )
}

目錄

發佈留言

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

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

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

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

訂閱電子報

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

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

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

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

訂閱電子報

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