你有沒有試過在 WordPress 後台拖拽選單項目,儲存後卻發現某個「自訂連結」無故消失,或者前台選單出現一堆看不懂的英文字串?打開資料庫一看,wp_posts 裡面躺著一筆 changeset 類型的紀錄,內容是 nav_menu_item 的序列化資料,但 object_id 是 0、url 指向一個不存在的 https://x/。這不是主題壞了,而是選單項目的資料結構在儲存過程中寫入了不完整的欄位。本文以 2026 年 WordPress 6.x 的運作方式,拆解這個問題的成因與修復步驟。
為何選單會寫入 changeset?先搞懂導航項目的儲存邏輯
WordPress 自 4.7 起引入 changeset(變更集)機制,原意是讓自訂器(Customizer)可以暫存未發佈的改動。當你透過外掛、REST API 或自訂程式碼新增選單項目時,若沒有正確帶入 nav_menu_term_id 與 menu_item_parent,系統有機會把這筆資料歸類為 changeset,而非正式的 nav_menu_item。結果就是前台選單抓不到該項目,後台卻見到一筆「幽靈紀錄」。
另一種常見情況:type 設為 custom、title 設為 p、url 設為 https://x/,這通常是測試資料或外掛匯入失敗的殘留。它不影響網站安全,但會令選單管理頁面出現混亂,甚至令選單儲存時出現「無法更新」的提示。
三步排查:由資料庫到前台逐層修正
第一步:備份,永遠是備份
任何直接改動資料庫的操作都有風險。請先透過主機控制台或備份外掛匯出 wp_posts 與 wp_postmeta,確認可以還原後才繼續。若你不熟悉 SQL,建議使用 WP-CLI 或可信的資料庫管理外掛,避免手誤刪除正式選單。
第二步:辨認哪些紀錄屬於 changeset
在 wp_posts 中,post_type 為 customize_changeset 的紀錄就是變更集。你可以用以下條件篩選:post_type = 'customize_changeset' 且 post_status = 'publish' 或 auto-draft。正常情況下,已發佈的變更集會在套用後自動清理;若長期殘留,多數是外掛衝突或程式碼未呼叫 wp_delete_post() 所致。
第三步:修正正式選單項目
若問題出在正式的 nav_menu_item,請檢查以下欄位是否合理:menu_item_parent 應為 0 或有效的父項目 ID;nav_menu_term_id 必須對應 wp_terms 中真實存在的選單分類;url 不應為空白或 https://x/。修正後,到「外觀 → 選單」重新儲存一次,讓 WordPress 重建選單快取。
2026 年新觀點:區塊主題與選單的互動
隨着 WordPress 區塊主題(Block Theme)普及,導航選單已逐步轉向 wp_navigation 自訂文章類型儲存。舊式的 nav_menu_item 仍然有效,但若你同時使用傳統選單與區塊導航,有機會出現兩套資料不同步。2026 年的建議是:要麼全面轉用區塊導航,要麼在 functions.php 中明確註冊選單位置,避免混用。若你正考慮轉換,可參考本站另一篇關於區塊主題設定的文章,了解遷移步驟。
常見疑問(FAQ)
- 刪除 changeset 會否影響現有選單?不會。Changeset 只是暫存紀錄,刪除後不影響已發佈的選單項目。但刪除前仍建議備份。
- 為何選單項目儲存後 object_id 變成 0?通常是因為該項目原本連結的文章或頁面已被刪除,WordPress 無法對應而寫入 0。請重新建立連結或改為自訂連結。
- 可以用外掛自動清理嗎?可以,但請選擇更新頻繁、評價良好的外掛,並在測試站先行驗證。切勿用來歷不明的工具直接改動資料庫。
選單問題看似瑣碎,卻直接影響訪客瀏覽體驗。若你按上述步驟檢查後仍未解決,建議先停用所有外掛,切換至預設主題測試,以排除衝突來源。進行任何修改前,請確保已有完整備份;本文僅供技術參考,不構成任何保證或專業支援。如需進一步協助,可查閱 WordPress 官方文件或諮詢你的網站開發人員。

