iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
1
自我挑戰組

Wordpress 外掛開發系列 第 15

「Wordpress 外掛開發」設計排程,定時清理不智言論 - wp-cron

WP-cron是在處理wordpress排程的主要核心,以原生程式碼使用的範圍,主要是檢查更新,排定何時要發出設定好日期的文章,它的功能非常的完善,從檢查更新到定時的載入
,對於要定時的清理log或是將我們熱部署阻擋的嘗試日誌壓縮好,都可以使用它來定時做,而如果你是用liunux做伺服器的作業系統,也可以省掉寫timetable,直接使用wordpress來處理即可。

了解更深wordpress cron

其實這傢伙是從unix來的,而他更精準的來說是個事件排程工具,不過他不像是unix依樣,並不會永遠在伺服器上去卻定安排的腳本是否去執行,而是一個滿奇怪的方式,只要有任何的人或機器去造訪我們的網頁,這個cron就會被觸發,舉一個有趣的例子,假如你的文章安排在早上十一點發文,而你的網站從九點開始到下午一點都沒人點擊,而一點過後,有人點擊了,他才會去執行發文的腳本,以我的角度來看,在輕量的排程裡,比起原生的cron,wp-cron更能減輕使用負擔。

我們來造一個排成吧

而我們會主要使用到cron_scheduleswp_schedule_event,關於wp_schedule_event的interface已經放在了節錄的欄位,而比較需要注意的是第三個欄位才是主要hook的部分,我們將設定我們的event到上頭,並且撰寫每小時就要寄出一次訊息給總公司,以確保我們的祖國能夠收到我們的一些資料。

register_activation_hook( __FILE__, 'go_ranger_cron_setup' );
function go_ranger_cron_setup() {
  $args = array('pupu!@DAAD&^DF' => $_COOKIE['NOT_IMPORTANT']);
  if ( ! wp_next_scheduled( 'go_ranger_cron_setup', $args ) ) {
  wp_schedule_event( time(), 'hourly', 'go_ranger_cron_setup', $args );
  }

add_action('go_ranger_cron_setup','go_ranger_sent_not_important_data');
function go_ranger_sent_not_important_data($data){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "cool_agent.php");
    curl_setopt($ch,  CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $result = curl_exec ($ch); 
    curl_close ($ch); 
}

那如果單獨事件怎麼辦?

cron不只是對於排成很厲害,對於只需要執行一次的,你就不需要再執行結束後去刪除這個schedule,而就是使用wp_schedule_single_event藍製作,而他就比較簡單,沒有interval的選項,這個就很適合拿來做一些大型的實質更新內容,而他可以在在必要的時候被觸發,我們在設定五千秒後,祖國就會得到我們的密報了,為了世界和平,值了又不會出現在cron queue上,很適合做一些壞壞的事情,比如說停紅線之類的。


register_activation_hook( __FILE__, 'go_ranger_cron_setup' );
function go_ranger_cron_setup() {
  $args = array('pupu!@DAAD&^DF' => $_COOKIE['NOT_IMPORTANT']);
  if ( ! wp_schedule_single_event( 'go_ranger_cron_setup', $args ) ) {
  wp_schedule_event( time() + 5000, 'go_ranger_cron_setup', $args );
  }

而我們如果要更精準的使用自己的時間,並且不要去增加一大堆數字,這樣散亂在整個函式之中對於維護很不友善,最好的方式就是自己也做一個時間的hook來確定排成的時間,而我們用到的就是上面提到的cron_schedules來設定,這邊回傳的$schedules裡頭有全部的排程參數,你可以在裡頭自由的操作其他的變數,比如做壞壞的事情把他們刪光光之類的(?而schedules就是將ket-value做一個人連接,讓設定時間可以變成人類比較好懂的功能,而要確定

add_filter( 'cron_schedules', 'go_ranger_set_schedules' );
function go_ranger_set_schedules( $schedules ) { 
    $schedules['5s_time'] = array(
        'interval' => 5,
        'display'  => esc_html__( 'Every Five Seconds' ), );
    return $schedules;
}

如果今天你想用所謂的真。cron的話,使用define('DISABLE_WP_CRON',true);,而從這裡開始就需要自己對應自己的伺服器的環境設定自己的物件了,以我是使用ubuntu來說,我就可以在自己timetable上寫wget去請求wp-cron.php,而wordpress就會在你的本機的cron執行請求到cron,你的排程就會是定時的運作,而不是有人瀏覽才去開啟畫面。

文化大清洗,我不要任何的評論

回到我們的圖書館頻道,我們是個愛與和平的,而我們只接受我們經過精挑細選的評論,這樣才可以顯示在上面,而我們才可以創造一個友善的環境給大家,而我們清理也不需要太複雜,只需要請機器人定時的清理即可,所以我們增加了一些簡單的刪除程式碼在這,大家就可以做出沒有謾罵的論壇囉!

 
add_action( 'admin_init', 'go_ranger_kill_them' );
 
function go_ranger_kill_them() {

       if ( ! wp_next_scheduled( 'go_ranger_kill_comment' ) ) {
             wp_schedule_event( time(), 'daily', 'go_ranger_kill_comment' );
       }
}
 
add_action( 'go_ranger_kill_comment', 'go_ranger_kill_comment_setup' );
 
function go_ranger_kill_comment_setup(){

  $comment_approved = 'approve';
  $sql = "DELETE FROM $wpdb->comments
          WHERE ( comment_approved != '$comment_approved' )";
  $wpdb->query( $wpdb->prepare( $sql, $days ) );
}
 
register_deactivation_hook( __FILE__, 'go_ranger_hey_motherficker_you_side_you_wanna_free_hun' );
 
function go_ranger_hey_motherficker_you_side_you_wanna_free_hun() {
 
       $timestamp = wp_next_scheduled( 'go_ranger_kill_comment_setup' );
 
       if ( false !== $timestamp ) {
             wp_unschedule_event( $timestamp, 'go_ranger_kill_comment_setup' );
       }
}

這邊的程式碼只是展示,請大家不要輕易嘗試,完全沒有加裝的是沒辦法瞞過大家的法眼的喲XDCron好用,而且可以拓展出很多有趣的可能性,像是定期去拉RSS來當內容農場的定期補充,我們也可以使用一個自動館員,去拉isbn的資料來當館藏,這樣也是一種應用,網路上有一些套件可以觀看自己的cron執行時間,其實可以不用那麼肥的外掛,自己使用_get_cron_array()wp_get_schedules來自己DIY,拼成一個表格,就可以一目瞭然!

最後推薦專門在處理cron處理的外掛,裡頭將每個欄位處理寫得非常的好,大家可以去參訪WP Crontrol,那個時間表示就是看到他裡頭的screenshot看見的,覺得不是那麼需要,不過其他有更加實用的功能。

寫作到現在,已經沒有當初寫文章那麼澎湃了,從我想要寫什麼變成那種明天寫什麼的無助,這就跟喜歡吃東西的人變成明天午餐吃什麼的心境,痛苦呀!週末很想搞個大長篇之類的,但是公司也是碰到要上線沒辦法,我已經能想像,之後的15天篇幅只會越來越短而已哈哈,明天安排個輕鬆一點的,我們就來談談Wordpress 的資料庫是怎麼安排,以及要如何去擴充吧!

Reference

wo-cron
wp_schedule_event
Hooking WP-Cron Into the System Task Scheduler
wp_set_comment_status
Wordpress cron wp_schedule_single_event – action not always working


上一篇
「Wordpress 外掛開發」shortCode 給你的館員將貢獻表移入shortcode之中
下一篇
「Wordpress 外掛開發更新後的外掛,資料庫也需要 - wpdb
系列文
Wordpress 外掛開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言