利用 Hook 處理 WordPress 錯失排程(Missed Schedule)的幾種解法

在維護眾多 WordPress 網站,終於換我碰到這個問題了,一般我寫文實在太懶又太少,所以自己根本不會碰到錯失排程的問題

通常寫 WordPress 如果你很常使用文章排程設定發布時間,那你或許碰過這樣的問題,但你只是排程一天一篇,或許根本不會發現問題、也覺得沒關係

不過….你的網站是很多人一起寫不同文章,而且都要排程的情況下,大概就會機率碰到這個問題

注意!我舉例的方式是不修改系統代碼、不用主機指令以及外掛的方式去的

我也可以先說…前兩種方式我測試其實沒有成功
不知道是不是系統還是外掛影響的關係?
而第三種方式是我自己寫的

 

如果有發現任何問題,請告訴我哦!

 

第一種 讓系統進行備用排程檢查

* 開啟 wp-config.php
* 於 WP_DEBUG define 下方加入代碼

代碼:


/* 檔案: /wp-config.php */
define('ALTERNATE_WP_CRON', true);

第二種 修改排程 request timeout

* 開啟(子)佈景的 functions.php 或客製檔案執行區
* 在最下方或是指定地方加入以下代碼


/* 檔案: /wp-content/themes/(子)佈景/functions.php */

function achang_cron_debug( $cron_request_array ) {
    
    if( isset($cron_request_array['args']) ){
        $cron_request_array['args']['timeout'] = 5;
    }

    return $cron_request_array;

}

add_filter( 'cron_request', 'achang_cron_debug', 10 );

第三種 檢查排程文章時間並發佈

* 開啟(子)佈景的 functions.php 或客製檔案執行區
* 在最下方或是指定地方加入以下代碼

代碼:


/* 檔案: /wp-content/themes/(子)佈景/functions.php */

function achang_missed_posts() {
    global $pagenow;

    // $pagenow == edit.php 是後台文章列表
    // is_front_page 是首頁
    // is_single 是文章內頁
    if( 'edit.php' == $pagenow || is_front_page() || is_single() ) {
        global $wpdb;
        // 取得現在 GTM+0 的時間 (不會被時區影響)
        $check_time = current_time('mysql', 1);

        // 取得所有排程時間小於現在時間的排程文章
        $future_posts = $wpdb->get_results("SELECT ID FROM `{$wpdb->posts}` WHERE `post_status`='future' AND `post_date_gmt` < '{$check_time}'");
        if( $future_posts ) {
            foreach( $future_posts as $_post ) {
                // 發表文章
                wp_publish_post($_post->ID);
            }
        }
    }
}
// 前端 <head> 時觸發
add_action('wp_head', 'achang_missed_posts');
// 後端觸發
add_action('admin_init', 'achang_missed_posts');

 

相連文章

臉書留言

一般留言

發佈留言

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