
前一天晚上寫好文章,排定隔天早上 8 點自動發佈。隔天中午打開網站,文章沒有出現;到後台的文章列表一看,那篇文章旁邊用紅字寫著:
已錯過排程
時間設對了,文章也確實排好了,為什麼沒有發出去?這篇說明 WordPress 的排程是怎麼運作的,以及怎麼讓它準時。
WordPress 的排程,要有人來才會動
WordPress 有一套內建的排程系統,叫做 WP-Cron。排程發佈文章、定時檢查更新、清理過期資料,都是靠它。
但 WP-Cron 不是一個 24 小時不停在看時鐘的鬧鐘。它的運作方式是:每次有人打開網站時,WordPress 順便看一下有沒有到期的工作,有的話,再從主機自己連回自己的網站(這叫「回送要求」),去執行那些工作。
這個設計在大部分網站都沒問題,但有兩種情況會讓排程卡住:
第一,沒有人來。流量很少的網站,早上 8 點到中午之間可能沒有任何人打開,排程就一直沒被觸發。
第二,回送要求失敗。有人來了,WordPress 也想執行工作,但主機連回自己的網站時被擋下來或逾時,例如主機的防火牆、網站加了密碼保護、DNS 設定有問題,工作還是沒有執行。
我們在測試站重現了一次
我們在測試站排了一篇 65 秒後發佈的文章。測試站的環境剛好無法完成回送要求,時間到了之後,我們打開前台三次,模擬有訪客來看網站。
結果文章還是沒有發佈,後台文章列表顯示「已錯過排程」。到「工具 → 網站狀態」看,有兩項相關的警告:
這個網站的回送要求無法完成
排程事件執行失敗
接著我們直接打開網站的 wp-cron.php 這個網址,文章馬上就變成「已發佈」了。
這個實驗說明了兩件事:排程卡住的原因是工作沒有被執行,而只要有人去觸發 wp-cron.php,工作就會完成。
先看網站狀態
文章錯過排程時,先到後台「工具 → 網站狀態」看看。如果出現「這個網站的回送要求無法完成」或「排程事件已延遲」「排程事件執行失敗」,就是上面說的第二種情況,可以把網站狀態裡的錯誤訊息給主機商看,請他們檢查主機為什麼連不回自己的網站。網站狀態裡其他的項目,在〈WordPress 網站狀態(Site Health)的建議怎麼看?〉。
最穩定的做法:改用主機的排程
不管是流量少,還是回送要求不穩,最穩定的解法都一樣:讓主機定時去打開 wp-cron.php,不再依賴訪客。
第一步,在 wp-config.php 的「That's all, stop editing!」那一行上面加入:
define( 'DISABLE_WP_CRON', true );這一行的意思是:訪客打開網站時,不要再順便觸發排程。
第二步,在主機控制台的「排程工作」(cPanel 叫 Cron Jobs)新增一個工作,每 5 分鐘執行一次:
wget -q -O - https://你的網址/wp-cron.php?doing_wp_cron > /dev/null 2>&1這樣一來,不管有沒有人來,主機每 5 分鐘都會去觸發一次排程,文章最晚 5 分鐘內就會發佈。主機排程的寫法,在〈WordPress 排程自動清理垃圾留言和修訂版本〉也有說明。
兩步一定要一起做。 只加了第一步、沒有設定主機排程,WordPress 的排程就完全不會執行了,不只文章,連自動更新、清理等工作都會停擺。
已經錯過的文章怎麼辦
已經錯過排程的文章,要等排程真的執行時才會發佈。設定好主機排程之後,下一次排程執行時,到期的工作會一起被處理;急的話,也可以直接打開文章的編輯畫面,按「發佈」手動發出去。
也要確認時區
如果文章是「晚了 8 小時才發佈」,問題可能不在排程,而在時區。到「設定 → 一般」確認時區設成台北,原因在〈WordPress 時間不對?〉。
正威網路行銷是 25 年經驗的基隆網頁設計工作室,網站管家年費包含系統、外掛與安全性更新和基礎後台管理服務,台北與全台客戶也歡迎免費諮詢。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。