上個月紀錄過如何使用單次排程來執行任務,也就是只會在特定時間執行一次,但在自動化作業的前提下,重複執行的定期排程會是比較常用到的情境,也就是每分鐘、每小時甚至是每天的固定時間執行。
使用 Action Schedule 註冊定期排程的方法為 as_schedule_recurring_action
,該方法帶有五個參數,常用的是前三個:$timestamp
開始時間、$interval_in_seconds
以秒數計算的執行間隔,以及 $hook
勾點名稱。
假設我要在每天晚上的凌晨十二點執行,首先要抓到當日凌晨十二點的 timestamp 也就是時間戳記,這個戳記指的是今天現在這個時間點距離 1970/01/01 00:00:00 的秒數,在 PHP 中可以用 strtotime()
來算出這個數字。’
strtotime()
可以用語意化的方式來算出時間戳記,如果是要取得當日凌晨十二點,那就是寫成 strtotime(‘today midnight‘)
,如果是要明天凌晨十二點,寫成 strtotime(‘tommorow midnight’)
,或是也可以直接指定時間:strtotime(‘00:00:00’)
。
需要注意的是時間戳記預設的時區是 GMT+0,也就是格林威治時間,在台灣的話是 GMT+8 快八小時,因此如果你是想要用台灣時間來執行排程,就需要把時間戳記減去八小時的秒數,也就是 strtotime(‘00:00:00’) - 8*3600
,才會是台灣時間的凌晨十二點。
第二個參數是 $interval_in_seconds
,代表的是每次執行期間相隔的秒數,在 WordPress 裡面有幾個秒數相關的常數可運用:
MINUTE_IN_SECONDS
:一分鐘的秒數,等於 60 秒
HOUR_IN_SECONDS
:一小時的秒數,等於 60 * 60 = 3600 秒
DAY_IN_SECONDS
:一天的秒數,等於 24 * 60 * 60 = 86400 秒
WEEK_IN_SECONDS
:一週的秒數,等於 7 * 24 * 60 * 60 = 604800 秒
MONTH_IN_SECONDS
:一個月的秒數,等於 30 * 24 * 60 * 60 = 2592000 秒
YEAR_IN_SECONDS
:一年的秒數,等於 365 * 24 * 60 * 60 = 31536000 秒
如果要每天執行的話就使用 DAY_IN_SECONDS
,如果是要每十分鐘的話就用 10 x MINUTE_IN_SECONDS
,每三小時五十分鐘就用 3 x HOUR_IN_SECONDS
+ 50 x MINUTE_IN_SECONDS
。
第三個參數是排程的名稱,另外要注意的是我們要確保這個定期排程只會註冊一次,所以在註冊前先用 as_next_scheduled_aciton
傳入排程名稱來檢查,避免跟其他同名的排程衝突。
完整程式碼如下:
<?php
/**
* 註冊定期排程
*/
add_aciton(
'init',
function() {
if ( ! as_next_scheduled_action( 'my_cron_name' ) ) {
as_schedule_recurring_action( strtotime( '00:00:00' ) - 8 * 3600, DAY_IN_SECONDS, 'my_cron_name' );
}
}
);
/**
* 執行排程事件
*/
add_action(
'my_cron_name',
function() {
// do something.
}
);