2020 年 3 月 25 日

IT Skills 波林

Polin WEI – 資訊工作者的技術手札

利用 WordPress 排程掛鉤 ( Cron schedule)自動同步微信粉絲

2 min read
鹿野高台

利用 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 – 微信插件介紹與安裝 剛好有一個功能需求是希望能定時去 微信訂閱號 裡,同步粉絲到地端的資料庫,這樣就不用每次要發訊息給粉絲時,都要去 微信訂閱號 裡查詢,這樣發送訊息時,執行速度就快多了。

 

  1. 客製 WordPress 排程前的整個範例過程瞭解
  2. 實作 WordPress 排程 ( Cron schedule)自動同步微信粉絲
  3. 利用外掛: wp-contol 觀察排程

 

  • 在客製 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) 的過程。 這是 Sushil Adhikari 的貢獻,真是要感謝他…若他能看到這篇文章的話…

 

  • 實作 利用 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 來觀察,安裝完後可以在 控制台 -> 設定 -> Cron Schedules 中看到客制化排程選項: wpwx_scheduleTime是否存在

wp-cron-schedules

 

而在 控制台 -> 工具 -> Cron Events 中可以看到是否有排桯在等待執行

 

wp-cron-events

 

 

Copyright © All rights reserved. | Newsphere by AF themes.