← 回到 Blog
WordPress約 3 分鐘閱讀

WordPress 維護不要只貼指令:command output 要怎麼留下可判讀紀錄

分類WordPress網站經營自動化工作流
標籤#WordPress#WP-CLI#維護紀錄#故障排除#網站維運
程式碼編輯器中的維護紀錄,象徵 WordPress WP-CLI、curl 與 log output 判讀

WordPress 維護紀錄裡最常看到的句子是:「已清快取」、「已停用外掛」、「已跑 WP-CLI」。問題是,下一次同樣狀況發生時,這些句子幾乎不能判斷當時到底發生什麼事。真正有價值的不是指令名稱,而是執行環境、輸出結果、你怎麼解讀它,以及改完後用什麼方式確認沒有副作用。

如果只是把一串 shell history 貼到記事本,也不算完整紀錄。command output 需要被整理成「可判讀」的維護筆記:讀的人不用猜當時網站版本、不用猜錯誤是在 WordPress、PHP、Nginx、CDN 還是快取層,也能知道哪些步驟只是觀察、哪些步驟真的改動了正式站。

先把觀察指令和變更指令分開

維護筆記第一個要分清楚的是:這個指令只是讀資料,還是會改變網站狀態。

# 觀察型:讀取目前狀態
wp plugin list --status=active
wp option get home
wp cron event list --due-now

# 變更型:會改變網站狀態
wp plugin deactivate some-cache-plugin
wp cache flush
wp rewrite flush --hard

我會建議在紀錄中直接標示:

  • observe:只讀狀態,不改網站。
  • change:會改變外掛、快取、rewrite、資料庫或檔案。
  • verify:用來確認前一步是否有效。
  • rollback:用來回復前一步。

這樣做的好處是,未來要回顧事故時,不會把「檢查」誤看成「修復」。很多 WordPress 問題是快取、排程或 CDN 疊在一起造成的,如果沒有分清楚變更點,就很難知道是哪一步真的讓網站恢復。

紀錄 command output 時,不要只留最後一行

有些指令的 exit code 是 0,但輸出內容仍然透露風險。例如外掛清單裡出現停用中的 cache plugin、cron event 堆積、或 HTTP response 其實是登入頁 HTML。

比較有用的紀錄格式會長這樣:

[observe] 2026-08-06 09:10 +0800
host: production-web-01
path: /var/www/example.com/public
command:
  wp plugin list --status=active

output summary:
  - cache plugin: active
  - seo plugin: active
  - backup plugin: active

judgement:
  cache layer is present, so frontend freshness issues
  should not be judged by WordPress admin state alone.

這不是為了把每個字都保存下來,而是把「輸出重點」和「判斷」放在同一段。若 output 很長,可以只保留關鍵片段,但不要刪掉錯誤碼、版本、路徑、外掛名稱與時間。

curl 要同時看 status、content-type 和下載大小

WordPress 前台頁面、圖片、REST API 或 sitemap 看起來「打得開」,不代表回應是正確內容。最少要同時看三件事:

curl -L -sS -o /dev/null \
  -w 'status=%{http_code} type=%{content_type} size=%{size_download}\n' \
  'https://www.example.com/wp-json/'

判讀時可以這樣寫:

[verify]
url: /wp-json/
status: 200
content-type: application/json
size: 18432
judgement:
  REST API endpoint is reachable and returns JSON.
  This does not prove wp-admin is healthy,
  but excludes a basic routing or WAF block.

如果 status=200content-type=text/html,可能是被導到登入頁、維護頁或錯誤頁。若 size 小得不合理,也要打開 response body 看是不是只有一段防火牆訊息。這類細節如果沒有記錄,下一次排查會重新踩一次。

log 片段要保留前後文,不要只貼 ERROR

只貼一行 PHP Fatal error 通常不夠。至少保留錯誤前後幾行、時間、request path、plugin/theme 路徑與 PHP version。範例格式:

[observe]
source: php-fpm error log
window: 2026-08-06 09:00-09:15 +0800
keyword: Fatal error

context:
  request: /wp-admin/edit.php
  plugin path: wp-content/plugins/example-plugin/
  repeated: 12 times in 15 minutes

judgement:
  the symptom appears in wp-admin post list,
  but the repeated stack points to one plugin path.
  Do not clear all caches before isolating that plugin.

如果目前沒有完整 log,就誠實寫「尚未取得完整 log」。不要把猜測寫成結論,也不要說「應該是某外掛壞掉」但沒有任何堆疊、URL 或時間證據。

把回復方式寫在變更旁邊

正式站維護最怕的是改完有效,但沒有人知道怎麼回復。每一個 change 最好旁邊就有 rollback

[change]
command:
  wp plugin deactivate some-cache-plugin
reason:
  isolate whether page cache is serving stale post list.

[rollback]
command:
  wp plugin activate some-cache-plugin
verify after rollback:
  curl homepage, /blog, and one article URL;
  confirm status, content-type, and expected title snippet.

這樣的紀錄讓維護不只是「做了什麼」,也包含「做錯了怎麼退」。如果是資料庫、檔案或 CDN 設定,更應該先確認備份與權限,不要把不可逆變更當成一般排查步驟。

UCAMC 會怎麼把它整理成文章或內部筆記

公開文章不需要貼出敏感路徑、IP、token、客戶網域或完整伺服器資訊;內部維護筆記則可以保留更細的環境資訊。比較好的做法是分兩層:

  1. 內部紀錄:完整保存時間、環境、指令、output、判斷、回復方式。
  2. 公開文章:抽象化網域與機密資訊,只保留可學習的排查順序與判讀方法。

這篇文章採用的是第二種寫法。它不假裝已取得某一次正式事故的完整 log,而是整理 WordPress 維護紀錄應該如何被保存,讓下一次面對外掛衝突、快取 stale、WP-Cron 堆積或圖片 CDN 問題時,不會只剩「我好像清過快取」這種無法交接的描述。

最後檢查:這份紀錄能不能讓別人接手?

寫完維護紀錄後,可以用三個問題檢查:

  • 沒參與當天維護的人,能不能知道哪一步是觀察、哪一步是變更?
  • 如果同一問題明天又發生,能不能重跑同一組 verify 指令比對結果?
  • 如果修復造成副作用,能不能找到 rollback 指令或至少知道回復方向?

若三個答案都是「可以」,command output 就不只是貼上去的文字,而是能支撐長期網站經營的技術資產。