WordPress 排程總是在「等風來」? Cron Job 改造指南,讓網站自動化準時上工!
☰ 目錄 table-of-contents.md
快速結論:為什麼你的 WordPress 排程不準時,以及怎麼修
WordPress 內建的 WP-Cron 並不是真正的系統排程,它只在「有訪客載入頁面」時才被觸發。流量低的網站排程會延遲,流量高的網站則可能因為重複觸發而拖慢伺服器。要讓排程準時又可靠,正解只有兩步:在 wp-config.php 加入 define('DISABLE_WP_CRON', true); 停用內建機制,再用主機真正的 Cron Job(cPanel 排程任務或 crontab 搭配 WP-CLI)每 5 到 15 分鐘觸發一次排程。
下面我會拆解 WP-Cron 的運作原理、它為什麼不可靠,並手把手帶你完成改造與驗證。
身為一個每天在程式碼和伺服器之間打滾的工程師,我看過太多網站效能不彰、功能失常的疑難雜症。其中一個最常見、卻也最容易被忽略的元兇,就是 WordPress 內建的排程系統 — WP-Cron。它就像個有點兩光的員工,心情好、有客人來訪時才工作,一旦網站沒人逛,它就跟著放假去了,這怎麼行!
你是否遇過預定發佈的文章到了時間卻沒動靜?或是備份外掛總是出現「錯過排程 (Missed schedule)」?這些問題很可能就是 WP-Cron 在跟你開玩笑。今天,我就要帶你徹底拆解這個「偽排程」系統,並教你如何用真正的伺服器 Cron Job 取代它,讓你的 WordPress Cron Job 自動排程設定從此準時又可靠,不再看訪客臉色辦事。
什麼是 WP-Cron?它和系統 Cron Job 不一樣
首先,我們得搞清楚 WP-Cron 到底是什麼。很多 WordPress 使用者,甚至一些有經驗的開發者,都以為它跟 Linux 系統裡的 Cron Job 是同一件事。嗯…這真是個美麗的誤會。
傳統的 Cron Job(或稱 cron daemon)是作業系統層級的任務排程器,它會像鬧鐘一樣,在指定的時間精準地執行任務,不管有沒有人正在使用這台機器。而 WP-Cron 並不是常駐的背景程序,它只是 WordPress 程式碼裡的一段邏輯。
WordPress 的創始者們考量到絕大多數使用者都在無法設定系統層級 Cron Job 的共享主機(Shared Hosting)上運作,為了讓排程功能在任何環境都能用,於是發明了這個權宜之計。它的運作機制是:
每當有訪客載入你網站的任何一個頁面時,WordPress 就會檢查目前是否有「到期待辦」的排程任務,有的話就觸發一個對
wp-cron.php的請求去執行它。
這個設計在當年確實是個聰明的解法,它讓 WordPress 在各種主機環境下都能執行基本的排程任務,例如:
- 定時發佈文章
- 檢查 WordPress 核心、佈景主題、外掛的更新
- 執行備份外掛的排程備份
- WooCommerce 的定期任務(如取消未付款訂單、處理訂閱扣款)
- 快取外掛的預先快取頁面任務
聽起來不錯,對吧?但問題就出在它的觸發機制 —它依賴訪客流量。這也為後續的效能與可靠性問題埋下了不定時炸彈。
WP-Cron 為什麼不可靠?低流量與高流量都中招
依賴流量的設計,會對兩種極端的網站造成困擾:流量太低的網站,和流量太高的網站。沒錯,不管高低,通通有獎,只是獎品你不會想要。
低流量網站:排程任務的無盡等待
想像一下,你設定了一篇重要公告要在凌晨三點準時發佈。但你的網站是個小眾部落格,半夜根本沒人會來逛。結果呢?WP-Cron 就跟著睡大覺了。直到隔天早上九點,第一位訪客進站,這個排程才被觸發,你的「凌晨三點公告」硬生生變成了「早上九點的馬後炮」。對於需要準時執行的任務,像是每晚的資料庫備份,這簡直是場災難。
高流量網站:效能的疊羅漢效應
如果你的網站流量很高,每秒都有好幾位訪客,情況會更糟。每次頁面載入都會觸發 WordPress 檢查排程,這本身就是額外的處理成本。當大量請求在短時間內同時嘗試執行 wp-cron.php 時,就可能形成所謂的「Cron Stampede」(排程踩踏):多個請求重複執行同一批任務,導致伺服器 CPU 負載瞬間飆高、網站回應變慢,嚴重時甚至造成資料庫鎖死,讓整個網站癱瘓。這就像一家餐廳門口只有一個服務生,卻有一百個客人同時進來都要他帶位一樣,場面絕對是一片混亂。
所以,無論你的網站流量高低,把網站自動化的心臟交給這麼不靠譜的機制,都不是明智的選擇。
如何把 WP-Cron 換成可靠的伺服器 Cron Job?
說了這麼多,該來動手解決問題了。目標很明確:關掉 WordPress 那個愛打混的 WP-Cron,再設定一個真正的「鬧鐘」,讓伺服器自己準時去叫 WordPress 工作。整個過程只需要兩大步驟。
步驟一:停用內建的 WP-Cron
這是最關鍵的一步。我們必須先告訴 WordPress:「好了,你不用再自己檢查排程了,我會叫人來通知你。」
請透過 FTP 或主機的檔案管理員,找到你網站根目錄下的 wp-config.php 檔案。打開它,並在 /* That's all, stop editing! Happy publishing. */ 這行註解的上方,加入以下這行程式碼:
define('DISABLE_WP_CRON', true);
儲存檔案,就這樣!為什麼要加在這行註解上方?因為這行以下的程式碼會載入 WordPress 核心,常數必須在那之前就定義好才會生效。完成後,你的網站不會再因為訪客載入頁面而自動觸發 wp-cron.php,可以有效減輕高流量下的伺服器負擔。
但別忘了,這也代表所有排程任務目前都停止了,直到我們完成下一步。所以兩個步驟務必一起做完。
步驟二:設定真正的伺服器 Cron Job
現在,我們要設定一個真正的鬧鐘。這需要在你的主機控制台或伺服器上進行。常見的方式有兩種,依你的主機環境選擇即可。
方法一:使用 cPanel 等主機控制面板(最常見)
這是大多數虛擬主機用戶會使用的方式,非常直觀。
- 登入你的 cPanel 主機管理後台。
- 在「進階 (Advanced)」區塊找到名為「Cron Jobs」或「排程任務」的圖示,點進去。
- 在「新增 Cron Job」的區塊設定執行頻率。一個通用的建議是每 5 到 15 分鐘執行一次;你可以在「通用設定」中選擇「Once Per Five Minutes (*/5 * * * *)」之類的選項。
- 在「指令 (Command)」欄位中填入以下指令(記得把
yourdomain.com換成你的網域名稱):
這個指令是讓伺服器透過wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1wget工具安靜地(-q)在背景訪問wp-cron.php,並把所有輸出丟到垃圾桶(>/dev/null 2>&1),避免產生一堆無用的日誌。你也可以用curl取代wget:curl -s https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - 點擊「新增 Cron Job」,大功告成!
這裡補充一個常被忽略的細節:網址後面帶的 doing_wp_cron 參數,是為了明確告訴 WordPress「這是一次主動觸發的排程執行」。由於我們已經在步驟一停用了訪客觸發機制,這個由外部 Cron Job 發起的請求,就成了唯一負責喚醒排程的角色。
方法二:在 VPS/專屬主機使用 WP-CLI(工程師推薦)
如果你使用的是 VPS 或更專業的主機環境,我強烈推薦用 WP-CLI 這個 WordPress 的命令列工具來觸發排程。為什麼?因為它直接透過 PHP 在伺服器本機執行,繞過了網頁伺服器(Nginx/Apache)與 HTTP 這一層,執行效率更高,也更不容易因為 HTTP 請求超時而失敗。
- 透過 SSH 連線到你的伺服器。
- 輸入
crontab -e來編輯你的 cron 排程列表。 - 在檔案中加入一行,設定每 15 分鐘執行一次(記得把
/path/to/your/wordpress/root換成你網站的實際路徑,並確認wp指令的實際路徑):
這行指令會先切換到 WordPress 根目錄,再執行*/15 * * * * cd /path/to/your/wordpress/root; /usr/local/bin/wp cron event run --due-now >/dev/null 2>&1wp cron event run --due-now,它會聰明地只執行「目前已經到期」的任務,而不會把未來的排程一次全部跑掉。 - 儲存並離開編輯器。你的伺服器現在就是最可靠的排程管理員了。
小提醒:crontab 的執行環境通常很精簡,wp 可能不在預設 PATH 裡,所以建議像上面一樣寫出完整路徑;你可以先在 SSH 中用 which wp 確認它的位置再填入。
如何驗證新的 Cron Job 設定是否成功?
改完設定後,總得確認它有沒有正常運作吧?最簡單的方式是安裝名為 WP Crontrol 的外掛。啟用後,到「工具」>「Cron Events」,就能看到所有已排程的任務列表。
驗證的步驟很單純:
- 記下目前某個排程任務的「下次執行 (Next Run)」時間。
- 等待你設定的間隔時間(例如 15 分鐘)過去。
- 重新整理 Cron Events 頁面。
如果一切正常,你會看到到期任務已經被執行、「下次執行」的時間也被正確地往後推移了。反之,如果時間沒有更新,甚至出現「Missed schedule」的警告,那很可能是第二步的伺服器 Cron Job 指令或設定有誤,需要回去仔細檢查(網域、路徑、指令拼字)。
結語:奪回網站自動化的主導權
我知道,對於非技術背景的使用者來說,修改 wp-config.php 或設定 Cron Job 可能聽起來有點嚇人。但相信我,這絕對是你為網站做的最值得的投資之一。你等於為網站的心臟做了一次升級手術,從此擺脫不可靠的訪客觸發機制,換來穩定、高效且準時的自動化系統。
從今天起,別再讓你的 WordPress 排程任務繼續「等風來」。動手改造你的 Cron Job,讓你的網站真正成為一個 24 小時全年無休的自動化機器。這才是專業網站該有的樣子!
延伸閱讀
- 企業官網該用 WordPress 嗎?2026 企業級開發完整指南
- 你的 WordPress 排程又失蹤了?搞定 WP-Cron,從此告別「錯過排程」惡夢!
- 告別 MAMP/XAMPP 惡夢! Docker + WP-CLI + Xdebug 本地開發環境完整指南
- WordPress 網站一片空白?教你啟用錯誤日誌 (Error Log),秒速揪出問題元兇!
如果你在設定過程中遇到任何困難,或是有更複雜的網站架構、效能優化需求,別忘了浪花科技的團隊隨時都在這裡。歡迎填寫表單與我們聯繫,讓我們為你的網站進行一次徹底的健檢與升級!
常見問題
WP-Cron 和 Linux 系統的 Cron Job 一樣嗎?
為什麼 WordPress 的排程文章或備份常常不準時?
如何讓 WordPress 排程準時可靠?
為什麼 DISABLE_WP_CRON 要加在 wp-config.php 的特定註解上方?
在 VPS 上用 WP-CLI 觸發排程比用 wget/curl 好在哪?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。