利用 WordPress 排程 ( Cron schedule)自動同步微信粉絲
WordPress 在官方文件對於 wp_schedule_event 的說明是:安排一個掛鉤 ( Hook ),該掛鉤 ( Hook )會讓 WordPress 在指定的排程時間觸發去執行任務,若在預定的排程時間沒有執行時,當有人訪問 WordPress 的網站時,也會觸發執行。
Schedules a hook which will be triggered by WordPress at the specified interval. The action will trigger when someone visits your WordPress site if the scheduled time has passed.
也就代表說,WordPress 的 wp-cron
它並不一定會如期執行您想要的任務,所以會有人建議使用 Linux 上的 Crontab
。但重點是:有些雲端主機不提供此項服務時,那也只能利用 WordPress 的 wp_schedule_event 功能了。在 WordPress Customize Plugin – 微信插件介紹與安裝 剛好有一個功能需求是希望能定時去 微信訂閱號 裡,同步粉絲到地端的資料庫,這樣就不用每次要發訊息給粉絲時,都要去 微信訂閱號 裡查詢,這樣發送訊息時,執行速度就快多了。
- 在客製 WordPress 排程需求時,先瞭解下方範例的整個過程:
Step 01: 外掛程式啟用 ( Enable ) 時,需要先向 WordPress 註冊掛鉤 ( Hook ): my_activation
,並實作 my_activation
的函數
register_activation_hook( __FILE__, 'my_activation' ); function my_activation() { $args = array( $args_1, $args_2 ); if (! wp_next_scheduled ( 'my_hourly_event', $args )) { wp_schedule_event( time(), 'hourly', 'my_hourly_event', $args ); } }
wp_next_scheduled()
函數是檢查是否有這個 掛鉤 ( Hook ): my_hourly_event
的排程任務? 若沒有則利用 wp_schedule_event()
任務排程函數加入它。在這的可以帶入其它的參數 $args
,若沒有也沒關係。而這裡的 'hourly'
是使用 WordPress 預設的排程選項,當然可以客制化一個屬於自已的排程,在後面的實作中會有說明。
Step 02: 加入排程掛鉤 ( Hook ): my_hourly_event
add_action( 'my_hourly_event', 'do_this_hourly', 10, 2 ); function do_this_hourly($args_1, $args_2 ) { // do something every hour }
若在 wp_schedule_event()
任務排程函數有註冊是要參數 $args
,那麼在註冊 排程掛鉤 ( Hook ): my_hourly_event
時要記得加入,而實作 do_this_hourly()
中也要加入接收。
Step 03: 外掛程式停用 ( Disable ) 時,需要先向 WordPress 註銷掛鉤 ( Hook ): my_deactivation
,並實作 my_deactivation
的函數
register_deactivation_hook( __FILE__, 'my_deactivation' ); function my_deactivation() { wp_clear_scheduled_hook( 'my_hourly_event' ); }
註銷掛鉤 ( Hook ): my_deactivation
的實作函數: my_deactivation
很簡單,只是利用 wp_clear_scheduled_hook()
來移除。這三步驟就是整個 WordPress 客製排程 ( Cron schedule) 的過程。 這是 的貢獻,真是要感謝他…若他能看到這篇文章的話…
- 實作 利用 WordPress 排程 ( Cron schedule)自動同步微信粉絲 的功能
Step 01: 客制化排程選項: wpwx_scheduleTime
/** * 客制排程時間: weixin_schedule_time */ function wpwx_add_cron_schedules($schedules) { $wpwx_scheduleTime = explode(":", get_option( 'wpwx_scheduleTime') ); $wpwx_schedule_hour = $wpwx_scheduleTime[0]; $schedules['weixin_schedule_time'] = array( 'interval' => $wpwx_schedule_hour * 3600, // hours in seconds. 'display' => "微信外掛排程: 每 ".$wpwx_schedule_hour." 小時一次", ); return $schedules; } add_filter('cron_schedules', 'wpwx_add_cron_schedules'); //Add a custom cron schedule: wpwx_add_cron_schedules
add_filter('cron_schedules', 'wpwx_add_cron_schedules')
是用來向 WordPress 註冊一個名為 'wpwx_add_cron_schedules'
的排程選項。
Step 02: 向 WordPress 註冊掛鉤 ( Hook ): wpwx_activation
// 啟用外掛時, 激活一個事件: wpwx_activation register_activation_hook( __FILE__, 'wpwx_activation' ); //激活事件: wpwx_activation 的實作 function wpwx_activation() { // 先查詢是否已有名為 'wpwx_sync_weixin_event' 的排程, 沒有的話就排定一個 if ( !wp_next_scheduled('wpwx_sync_weixin_event') ) { wp_schedule_event( time(), 'weixin_schedule_time', 'wpwx_sync_weixin_event'); } }
Step 03: 加入排程掛鉤 ( Hook ):
//注冊 wp_schedule_event() 的接口函數: wpwx_sync_weixin_event add_action('wpwx_sync_weixin_event', 'wpwx_sync_weixin_action'); // 接口函數: wpwx_sync_weixin_event 的實作方法 : wpwx_sync_weixin_action function wpwx_sync_weixin_action(){ // 抓取微信粉絲資料, 並同步於 table: wpwx_openids if ( get_option( 'wpwx_scheduleFlag') == 'true' ){ getAllOpenids(); } }
Step 04: 外掛程式停用 ( Disable ) 時,需要先向 WordPress 註銷掛鉤 ( Hook ): wpwx_deactivation
,並實作 wpwx_deactivation
的函數
// 停用外掛時, 移除一個事件: wpwx_deactivation register_deactivation_hook( __FILE__, 'wpwx_deactivation' ); //停用事件: wpwx_deactivation 的實作 function wpwx_deactivation() { wp_clear_scheduled_hook( 'wpwx_sync_weixin_event' ); }
- 利用外掛: wp-control 觀察排程
作好的排程要怎麼來觀察是否有真的排入呢? 可以安裝外掛: wp-control 來觀察,安裝完後可以在 控制台 -> 設定 -> Cron Schedules 中看到客制化排程選項: wpwx_scheduleTime
是否存在
而在 控制台 -> 工具 -> Cron Events 中可以看到是否有排桯在等待執行
你必須 登入 才能發表評論。