利用 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');
臉書留言
一般留言