某位使用者在 WordPress.org 官方支援論壇求助。他把 WordPress staging 環境的變更推送到正式站,按下確認後,正式站整個消失,只剩 staging 環境還在,連網址設定都跑掉,而且他不敢直接用備份救站,因為那份備份會連帶洗掉他在 staging 上做的重大修改。
這不是單純手滑。多數推送工具的預設行為,本來就是選「全部資料表」時,把整張表覆蓋過去,不是逐筆比對再合併。staging 建立之後,正式站自己新增的文章、留言、訂單,都會在推送當下被舊版本整批換掉,方向因此顛倒成舊蓋新。
WordPress staging 環境本來是用來保護正式站的機制,讓改版與測試不用直接動到線上內容。但只要「這次推送會動到什麼範圍」的認知,跟工具實際的行為對不上,它反而會變成蓋掉正式站的起點,而這個起點怎麼發生、蓋掉之後救不救得回來,往往取決於推送前那幾分鐘做了什麼準備。
全量推送與範圍勾選失誤,是蓋掉正式站的起點
多數把 WordPress staging 內容「push to live」的災難,起點不是介面故障,而是使用者對「這次推送會動到什麼範圍」的認知,跟工具實際的行為對不上。以為只是把外觀改動送上線,資料庫卻整張表被換掉;以為方向是把這陣子在 staging 做的東西送到正式站,結果正式站這段期間自己新增的內容,被舊版本整批蓋過去。這幾個環節湊在一起,才會釀成整個網站被覆寫的結果。

全選資料表等於整批覆寫,不會保留任何新內容
「全部資料表」這個選項,在各家工具裡實際做的事,不是有變動的才更新,而是把來源環境擁有的每一張資料表整個蓋過去,來源沒有異動的表也照樣蓋一次,沒有逐筆比對、逐筆合併的邏輯。WP Engine 官方文件把全量複製定義成包含環境裡所有檔案與所有資料庫資料表;選擇「全部資料表」時,來源與目的地都有的表在目的地會被覆寫,正式站原本已有的同名資料表一律被 staging 版本取代。
Kinsta 官方文件在說明選擇性推送功能時,把「Database」底下「All database tables」這個選項的效果講得更直白,一旦選了它,自 staging 建立後,對正式站資料庫做的任何異動都會遺失,範圍包括留言、新內容、電商網站的訂單、會員網站的註冊、論壇貼文。換句話說,這個選項名稱聽起來只是同步資料庫,實際行為卻是把正式站現在的資料庫整個換成 staging 那一份,中間沒有任何保留機制。
推送鍵和提取鍵的介面位置太相近,方向極易按反
推送到正式站與從正式站提取,在多數工具的操作面板上經常並排出現,用詞只差一個介系詞。WordPress.com 官方文件把兩個方向並列說明,把正式站內容拉進 staging 叫做提取,把 staging 內容推上正式站叫做推送,這 2 個選項放在同一個同步選單裡,操作路徑幾乎一模一樣,只差最後選哪一項。切換環境、時間緊迫或分心時,很容易點到反方向的按鈕,把本該保護的正式站,當成了要被覆寫的目的地。
這個風險大到連平台自己都承認。WordPress.com 因此要求同步到正式站時必須輸入網站網址才能繼續,等於把「這一步最容易按錯」寫進了強制關卡裡。WP Engine 的做法類似,操作介面上把推送與提取列在同一個動作選單,步驟完全平行,都要選來源、選目的地、選全部或自訂,來源環境會顯示為灰色鎖定,選錯了沒辦法在同一頁面修正,只能從頭到尾重新整個流程再跑一次。
staging 快照建立之後正式站新增的內容一併消失
很多人以為 staging 是舊版、正式站是新版,推送應該是把 staging 的改動疊加上去。但如果這段期間正式站自己也發布了新文章、收到新訂單、有人留了言,這些內容在時間軸上其實比 staging 更新,推送卻會用比較舊的 staging 資料把它們整批蓋過去,方向因此顛倒,不是新蓋舊,而是舊蓋新。
Kinsta 官方文件在多個情境下重複同一句警語,自 staging 建立後,正式站資料庫的任何異動都會遺失,包括但不限於留言、新內容、電商網站的購買紀錄、會員網站的註冊、論壇貼文。WordPress.com 官方文件說得更具體,同步資料庫時,staging 的資料庫內容會覆寫正式站相符的資料庫內容,涵蓋文章、頁面、設定與其他儲存資料,上次從正式站同步到 staging 之後,正式站新增的任何內容都會被取代;如果站上有 WooCommerce,就算正式站在建立 staging 副本之後才產生的新訂單,也會一併被清除。
正式站被整批覆寫之後,多半已經回不去
讀者心裡最直接的疑問,是 staging 裡明明什麼都還在,能不能就把它直接當成新的正式站。答案是不行。staging 只是「建立那一刻」的正式站切片,不是「蓋掉那一刻」的正式站,被覆寫掉的內容如果沒有另外備份,唯一留過那份資料的地方,也就是正式站資料庫本身,已經被覆寫,staging 從頭到尾都沒有那份資料,救不回來不是操作技巧的問題,而是那份資料根本不存在於任何地方。
staging 只是建立當下的正式站快照,不是蓋掉那一刻的備份
把整個過程放在時間軸上看,會更清楚問題出在哪裡。staging 建立在某個時間點,正式站被整批覆寫則發生在更晚的另一個時間點,兩者之間往往隔了幾天甚至幾週。staging 裡的內容永遠停留在它被建立的那一刻,這段期間正式站發生的一切,不管是新文章、留言,還是訂單,staging 從來沒有見過,因此不存在從 staging 找回這回事。
這不是特定工具的缺陷,而是所有 staging 工具共通的設計。Kinsta 官方文件與 WordPress.com 官方支援文件都清楚說明,staging 建立之後,正式站的異動不會反映進 staging,這代表 staging 環境本質上是一份快照,不是一個會持續跟正式站同步的鏡像。理解這個前提,才能明白為什麼覆寫發生之後,靠 staging 復原正式站行不通。
沒有備份就沒有蓋掉前一刻的還原點
還原點的本質,是在推送發生之前單獨產生、且獨立存放的一份正式站完整複本。如果推送前沒有人手動或自動做過這件事,覆寫發生的瞬間,那個時間點的正式站狀態,就從世界上唯一存在的地方,也就是正式站資料庫,徹底消失,沒有第二份副本留著。
WordPress.org 官方開發者手冊明確建議,資料庫要定期備份,尤其在每次升級之前一定要做一次,而且檔案備份與資料庫備份是 2 套分開的系統,通常不能靠下載 WordPress 目錄就備份到資料庫,因為資料庫其實存在目錄外部。這也解釋了為什麼「以為有備份」卻常常只備份了半套,很多人下載了整個網站的檔案,卻沒意識到資料庫需要另外處理。
推送流程本身也已經改寫 staging 的網址、連線設定
就算真的想拿 staging 頂著用,staging 本身在建立與維護過程中,網址、連線字串其實都已經被工具動過手腳,例如導向 staging 專用網域、加上防止搜尋引擎索引的標頭。直接把它改名成正式站,還得處理一整批這類殘留設定,不是單純換個網域名稱就能解決。
Kinsta 官方文件指出,staging 網站預設會被加上不建議搜尋引擎索引的設定,並附加特定的防索引標頭,這組標頭沒辦法從 Kinsta 提供的暫時網址或 staging 網址移除;如果 staging 用了自訂登入網址外掛,自訂路徑也會一併被複製到 staging 網址上。WP Engine 官方文件則提到,推送流程會針對推送範圍內的資料庫資料表,自動執行來源網域換成目的地網域的搜尋取代,代表 staging 本身的資料庫內容早就針對 staging 網域做過調整,不是跟正式站一模一樣、只是網址不同這麼單純可以互換;在多站網路(multisite)情境下,這個取代的結果可能超出預期,需要另外檢查。
內容被蓋掉之後先查主機商保留的快照
已經發生了,現在能做什麼,順序不是急著到處問人,而是先查有沒有任何一方在推送當下自動幫正式站留過快照。多數受管理主機的推送工具,會在覆寫目的地之前自動幫目的地做一次備份,這是工具內建的保護機制,不需要事先設定;查完主機商,再查有沒有排程備份外掛剛好留著推送前的版本,都沒有的話,才輪到網頁快照這種只能救回靜態文字、救不回資料庫的最後手段。
多數受管理主機會在推送前先留一份目的地快照
這份快照通常不會叫做備份,而是掛在推送紀錄、環境活動紀錄,或類似名稱底下,很多使用者不知道有這個機制,根本沒去找過,直接判定沒救了。
Kinsta 官方文件把這件事寫進推送流程的說明裡,推送發生前,系統會先幫目的地環境建一份備份,讓使用者在需要時可以復原;文件同時提醒,動態網站(例如電商)在推送與潛在復原之間新增的資料仍然可能遺失。WP Engine 官方文件的說法類似,複製流程開始前後,目的地都會被自動備份一次,之後才會真正被覆寫,使用者可以在備份紀錄裡找到覆寫發生前的那一份。這 2 家主流受管理主機的共通設計,值得讀者類推去查自己主機商的對應說明。
備份外掛的排程紀錄未必留著推送前那一版
如果站上本來就裝了排程備份外掛,這份紀錄能不能用,取決於備份週期是否剛好在推送前跑過一次,這是機率題,不是保證。同時要確認備份的內容是完整備份,也就是檔案加資料庫,還是只有檔案,因為被蓋掉的通常是資料庫內容,只有檔案的備份幫不上忙。
WordPress.org 官方開發者手冊把這一點講得很直接,檔案備份跟資料庫備份是分開的 2 件事,完整還原兩者都要具備。WordPress.org 官方教學課程也提到,使用主機商內建備份工具時,通常會分別列出檔案系統備份與資料庫備份兩份清單,查的時候別只看到有備份三個字就以為足夠,要點進去確認資料庫那一半真的包含在內。
靜態頁面快照,救不回資料庫裡的動態資料
找到 Wayback Machine 存檔,不等於網站已經救回來了。存檔頁面是當時瀏覽器看到的成品畫面,重建出來的網頁看起來像,但背後沒有資料庫,沒有真的能送出的表單,也沒有使用者帳號系統,只適合拿來把文字內容手動謄回新文章,不能當成完整的網站復原方案。
Internet Archive 官方說明中心指出,Wayback Machine 存的是頁面在特定時間點呈現的內容,包含圖片與版面樣式,但不會存下該頁面連結出去的其他頁面,也無法針對整個網站啟動一次爬取,代表就算要靠這個方法救資料,也得一頁一頁手動處理。Google 官方支援文件裡的網址檢查工具,也提供類似但更有限的功能,可以看到 Google 上次爬取某個網址時抓到的原始碼與回應內容,但這項功能只對已經被收錄的網址有效,且不含畫面截圖——截圖只有另外執行即時測試當下才看得到,同樣不包含後台或資料庫內容。
推送前的備份與範圍確認,決定蓋掉能不能復原
覆寫發生之後救不回來,是因為那個時間點的正式站狀態,根本沒有第二份副本留著;換句話說,只要推送前先把這份副本準備好,同一場災難就能整個逆轉。核心邏輯很單純,推送前多做「備份正式站」與「確認範圍」這 2 件事,前面描述的災難就會從無法復原,變成幾分鐘內可以復原。這不是什麼進階技巧,而是官方文件反覆強調、卻最容易被跳過的 2 個步驟。
推送之前要先建一份正式站當下的完整備份
這份備份要獨立於平台自動幫目的地留的那一份之外。平台自動備份是保底,使用者自己另外手動觸發一次備份,才能確保拿到的是推送前這一刻,而不是上一次排程跑到的時間點的正式站狀態,而且備份要同時包含檔案與資料庫兩個部分,缺一項都無法完整還原。
WP STAGING 官方文件把備份列為推送前的第一項強制檢查,務必在開始推送前先備份正式站,這樣萬一推送過程出狀況,幾分鐘內就能把正式站復原。文件也給出具體步驟,進入外掛的備份與搬遷功能建立新備份,備份完成後另外下載一份副本存在本機,才開始執行推送。WordPress.org 官方開發者手冊的說法呼應這一點,資料庫應該定期備份,而且每次升級之前一定要做一次。
確認推送來源與目的地要看網址,不是按鈕位置
避免方向按反,可以具體化成一個檢查動作。按下確認鍵之前,不要只看按鈕上寫的是推送還是提取,而是把畫面上顯示的來源網址與目的地網址都唸一遍,確認要覆寫的真的是要覆寫的那一個環境。多數工具要求輸入網站名稱才能繼續,這一步不要用複製貼上跳過,親自打一次字,等於再確認一次方向。
WordPress.com 官方文件明講,從 staging 同步到正式站時,系統會要求輸入網站網址才能確認同步,這一步被設計成強制關卡,正因為方向按反是已知的高風險失誤。WP Engine 官方文件則從介面設計的角度說明,操作畫面上來源環境會顯示為灰色鎖定,只能確認,無法在同一頁面直接切換,一開始選錯就要從麵包屑選單重新整個流程再走一次。
選擇性推送只勾選這次真正異動過的項目
能不整批推送就不整批推送。多數工具都提供指定檔案或指定資料表的選項,這次只改了佈景主題檔案就只勾檔案,只改了某個外掛設定就只勾對應的資料表,範圍愈小,正式站在推送當下需要承擔的覆寫風險就愈小,真的出錯時要復原的範圍也愈小。
Kinsta 官方文件把什麼情況該推哪一種整理成具體對照,只改了主題檔案的 HTML、CSS、PHP,且沒有存資料到資料庫的異動,只推檔案就好;只是新增或編輯一篇沒有上傳媒體的文章或頁面,只推資料庫就好;牽涉到上傳媒體的新內容、頁面編輯器與佈景主題設定同時異動、安裝或更新外掛,才需要檔案與資料庫一起推。WP STAGING 官方文件提供的是幾乎一致的判斷方式,只部署新文章、選單、外掛設定,只需要推資料庫;只部署佈景主題或外掛更新,只需要推檔案;真的兩者都動了,才需要檔案加資料庫一起推。

訂單、留言等交易資料,要排除在整批覆寫之外
電商與有留言、會員互動的站型要特別留意。這類站的正式站資料庫幾乎每分鐘都在變化,就算真的要整批推送資料庫,也要先把裝著訂單、使用者、留言的那幾張資料表從勾選清單裡拿掉,或者採用先把正式站資料庫同步回 staging、確認資料一致之後,再從 staging 推回正式站的順序,讓兩邊資料先對齊,不讓兩份資料互相蓋掉對方。
Kinsta 官方文件針對 WooCommerce 站提供 3 個具體做法:只推檔案,保留正式站資料庫不動;選擇性推送資料庫,並排除 WooCommerce 相關資料表;或者先把正式站資料庫同步回 staging,確認資料一致後,再把 staging 推回正式站。WP Engine 官方文件把要排除的資料表列得更具體,要排除文章與頁面就不勾 _posts、_postmeta;要排除使用者資料就不勾 _users、_usermeta;WooCommerce 站要額外排除訂單資料,就不勾 _posts、_postmeta、_woocommerce_order_items、_woocommerce_order_itemmeta;如果啟用高效能訂單儲存(HPOS),則改成不勾 _wc_orders、_wc_order_addresses、_wc_order_operational_date、_wc_orders_meta。WP STAGING 官方文件也提醒,站上有購物系統時不會想覆寫正式站的訂單與客戶資料,並提供對照說明指出該排除哪些表才不會蓋掉交易資料。

推送完成後的驗證,分成資料庫和檔案兩層
把備份做好、範圍勾對,還不代表萬事大吉,推送本身有沒有真的跑成功,仍然需要驗證。官方文件都把推送後驗證列為流程的最後一步,而不是選擇性動作。驗證通常分成 2 個層面,資料庫層確認內容真的還在、沒有被覆寫掉不該覆寫的東西,檔案層確認外掛版本、快取、登入都正常運作,兩層都過了才算真的推送成功。
資料庫層先核對最新文章、留言是否還在
打開正式站前台,找到推送前記得的最新一篇文章、最新一則留言、最新一筆訂單,確認它們還在,而不是只看首頁看起來正常就結案。首頁往往有快取,看起來正常不代表資料庫真的完整,要找到具體、有時間戳記可以核對的內容,才算真的檢查到。
WP STAGING 官方文件提供的推送後驗證清單裡,包含造訪正式站首頁確認新內容或設計已經生效,以及測試表單、結帳流程或關鍵功能是否正常,這 2 項對應的正是這裡建議的具體核對動作。文件也提醒,資料庫推送中途停滯,通常是 MySQL 的 max_allowed_packet 設定太小;推送後出現無法登入正式站後台的狀況,通常是使用者資料表被整批換成 staging 版本,帳密因此對不上,這些都是資料庫層要留意的常見徵狀。
檔案層核對外掛版本和快取是否已經清除
檔案層驗證的重點在版本一致與快取乾淨這 2 件事。推送後如果正式站的外掛版本跟 staging 對不起來,或者舊快取還在跑,很容易被誤判成推送失敗,其實只是快取還沒清乾淨。同時要留意,原本只該裝在 staging 的開發用外掛,會不會被整批檔案推送一起帶上正式站,需要另外手動移除。
WP STAGING 官方驗證清單明確把移除 staging 專用外掛列為推送後必做項目,推送到正式站之後,要手動移除那些不該在正式環境執行的外掛。Kinsta 官方文件則提醒推送後要清除任何內建快取,不管是佈景主題層級還是外掛層級,如果站上有啟用 CDN,還要另外到主機商後台清除 CDN 快取,否則使用者看到的可能還是舊版畫面,容易誤以為推送沒有生效。
網址與收錄層要留意 staging 殘留設定是否外流
這是容易被忘記的一塊。staging 網站原本應該處在防止搜尋引擎索引的狀態,推送過程如果不小心把這個設定也推上了正式站,正式站會意外從搜尋結果消失;反過來,如果 staging 本身不小心被取消了防索引,staging 網址可能已經被搜尋引擎收錄,事後需要另外處理,這 2 個方向都要各自確認一次。
Kinsta 官方文件說明,預設情況下 staging 網站會被打開「不建議搜尋引擎索引」的設定,並附加特定的防索引標頭,這組標頭無法從暫時網址或 staging 網址移除,只有加上自訂網域才能拿掉。文件另外提到,環境設定包含網址轉址規則、地理位置、PHP 與伺服器設定,在每一次推送時都會被包含在內,就算只選了檔案或只選了資料庫,這些環境層設定也可能完全覆寫目的地環境的既有設定,值得推送後另外檢查一次,確認轉址與索引相關的設定沒有被意外帶上正式站。
WordPress staging 原本的用意,是讓改版、測試、套版型都有一個安全的緩衝地帶,不用直接動到正式站。真正讓它變危險的,從來不是工具本身,而是「這次推送會動到什麼範圍」這件事,太容易被一個按鈕的位置、一個聽起來無害的選項名稱帶過去,沒有人真的停下來確認。
推送前把備份做好、把範圍勾對,這 2 件事花不了多少時間,卻是覆寫災難能不能在幾分鐘內復原的分水嶺。下一次要把 staging 推上正式站之前,不妨把這篇提到的檢查動作,套進實際要按下確認鍵的那一刻,讓推送真正只做它該做的事,而不是意外把整個正式站換成別的版本。
